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
1700472860
场景类稍有改动,如代码清单25-30所示。
1700472861
1700472862
代码清单25-30 场景类
1700472863
1700472864
public class Client{
1700472865
1700472866
public static void main(String[]args){
[
上一页 ]
[ :1.700472817e+09 ]
[
下一页 ]