打字猴:1.700472793e+09
1700472793
1700472794 public class Client{
1700472795
1700472796 public static void main(String[]args){
1700472797
1700472798 //定义一个演员
1700472799
1700472800 AbsActor actor=new OldActor();
1700472801
1700472802 //定义一个角色
1700472803
1700472804 Role role=new KungFuRole();
1700472805
1700472806 //开始演戏
1700472807
1700472808 actor.act(role);
1700472809
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);
[ 上一页 ]  [ :1.700472793e+09 ]  [ 下一页 ]