分类: Java
2012-09-10 14:58:32
利用 Delegation 和 Polymorphism 不同的两个概念,模拟爸妈对话的程序:爸爸说“Hello”,妈妈说“World”。
Delegation是java中常用的一种设计模式,一般是通过一些proxy类来实现对某个类功能的控制;而polymorphism则是面向对象中十分重要的一个概念,它可以通过override,overloading和interface来实现类的多态性。
当我看到这个小练习的时候,其实我第一感觉就是要设计出一个顶层类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();