1700472810
actor.act(new KungFuRole());
1700472811
1700472812
}
1700472813
1700472814
}
1700472815
1700472816
猜猜看运行结果是什么?很简单,运行结果如下所示。
1700472817
1700472818
演员可以扮演任何角色
1700472819
1700472820
年龄大了,不能演功夫角色
1700472821
1700472822
重载在编译器期就决定了要调用哪个方法,它是根据role的表面类型而决定调用act(Role role)方法,这是静态绑定;而Actor的执行方法act则是由其实际类型决定的,这是动态绑定。
1700472823
1700472824
一个演员可以扮演很多角色,我们的系统要适应这种变化,也就是根据演员、角色两个对象类型,完成不同的操作任务,该如何实现呢?很简单,我们让访问者模式上场就可以解决该问题,只要把角色类稍稍修改即可,如代码清单25-29所示。
1700472825
1700472826
代码清单25-29 引入访问者模式
1700472827
1700472828
public interface Role{
1700472829
1700472830
//演员要扮演的角色
1700472831
1700472832
public void accept(AbsActor actor);
1700472833
1700472834
}
1700472835
1700472836
public class KungFuRole implements Role{
1700472837
1700472838
//武功天下第一的角色
1700472839
1700472840
public void accept(AbsActor actor){
1700472841
1700472842
actor.act(this);
1700472843
1700472844
}
1700472845
1700472846
}
1700472847
1700472848
public class IdiotRole implements Role{
1700472849
1700472850
//一个弱智角色,由谁来扮演
1700472851
1700472852
public void accept(AbsActor actor){
1700472853
1700472854
actor.act(this);
1700472855
1700472856
}
1700472857
1700472858
}
1700472859
[
上一页 ]
[ :1.70047281e+09 ]
[
下一页 ]