“行为变化”模式
在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。
典型模式:①命令模式 ②访问者模式
访问者模式
-动机
在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。
如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?
-模式定义
表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。
-结构/类图
-要点总结
①访问者模式通过所谓双重分发(double dispatch)来实现在不更改(不添加新的操作-编译时)Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作(支持变化)。
②所谓双重分发即访问者模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept方法的多态辨析;第二个为visitElementX方法的多态辨析。
③访问者模式的最大缺点在于扩展类层次结构(增添新的Element子类),会导致访问者类的改变。因此访问者模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”。
代码
在这里先解释下多态辨析:子类拥有父类没有的方法
第54行:第一次多态辨析,第62(70)行:第二次多态辨析
代码如下:
结果如下:
以下转自大佬的博文:
访问者模式的举例分析
意思就是说,Mesh的隐藏可能涉及到3个步骤,Light的隐藏可能涉及到10个步骤,这样就可以在每个自己的Visitor中去实现每个元素的隐藏功能,这样就把很多跟元素类本身没用的代码转移到了Visitor中去了。
每个元素类可以对应于一个或者多个Visitor类。比如我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的。我们的访问者模式可以很好付诸在这个场景中:对于银行柜台来说,他们是不用变化的,就是说今天和明天提供个人业务的柜台是不需要有变化的。而我们作为访问者,今天来银行可能是取消费流水,明天来银行可能是去办理手机银行业务,这些是我们访问者的操作,一直是在变化的。