Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1146450
  • 博文数量: 103
  • 博客积分: 1897
  • 博客等级: 上尉
  • 技术积分: 1717
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 21:02
文章分类

全部博文(103)

文章存档

2013年(19)

2012年(84)

分类: Java

2012-09-10 14:58:32



利用 Delegation 和 Polymorphism 不同的两个概念,模拟爸妈对话的程序:爸爸说“Hello”,妈妈说“World”。

Delegationjava中常用的一种设计模式,一般是通过一些proxy类来实现对某个类功能的控制;而polymorphism则是面向对象中十分重要的一个概念,它可以通过overrideoverloadinginterface来实现类的多态性。

当我看到这个小练习的时候,其实我第一感觉就是要设计出一个顶层类person来抽象出父亲和母亲的公共属性,然后分析一下父亲和母亲的行为,都有一个talk的动作,只不过是发出的主题不同,所以,如果用polymorphism来实现这个功能,那么对应的程序如下:

//顶层通用类

 public class Person{

       public String property;//这里就用一个属性类来模拟所有的属性

//提供一个talk的方法

public void talk(String message){

       System.out.println(message);

}

}

//对应要有一个母亲类,继承了person

public class Mother extends Person{

 //other properties

 //other methods

}

//一个父亲类,同样继承了person

public class Father extends Person{

  //other properties

  //other methods;

}

//一个总的测试类

 publci static void main(String[] msg){

Mother m = new Mother();

Father f = new Father();

m.talk(“Hello”);

f.talk(“Hello”);

}

 

其实写到这里的时候,我感到其实上面Person类里实现的那个talk方法写得不够优雅,其实可以去掉顶层类中的talk方法,抽象出一个接口interface,名字叫做talker,如下

public interface talker(){

public void talk(String message);

}

然后让父亲类和母亲类分别去实现这个方法,把方法的实现放在父亲类和母亲类中,然后在测试类中,就可以改写成这样了。

Talker m = new Mother();

Talker f = new Father();

m.talk(“Hello”);

f.talk(“Hello”);

 

其实写到这里的时候,用多态来实现这个功能已经差不多了,但是有时我们会想可能想,如果父亲说完一句”hello”之后,要伸手去抱孩子,然后母亲说完一句“hello,,那要怎么来实现呢?是不是在talker里面再添加一个hold的方法呢?这样按照我们前面的做法,母亲那里也要实现这个hold方法,看似很麻烦,其实如果用Delegation来实现解决这个问题。

我们其实可以定义一个类名字叫TalkerProxy,类的实现如下:

public class TalkerProxy{

   //定义一个talker类,对应上面定义的接口

   public Talker talker;

  //构造方法,用于注入talk

 public TalkerProxy(Talker talker){

 this.talker = talker;

}

//做抱孩子的动作,题目没有要求这个,添加这个只是为了待会能够更好地去理解这个代理,//去掉这个对题目没有影响

public void hold(){

}

 

public void talk(String message){

     talker.talk(message);

     //做抱孩子的动作,去掉也行

      hold(); 

}

测试类里面就可以这样写了

public static void main(String args){

Talker m = new Father();

Talker f = new Mother();

//代理父亲的代理类

TalkerProxy talkerProxy = new TalkerProxy(f);

talkerProxy.talk(“hello”);

m.talk();


阅读(2584) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~