打字猴:1.70047281e+09
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 ]  [ 下一页 ]