Visitor(访问者)–对象行为型模式
一、意图
表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
二、动机
1.在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来繁重的变更负担,甚至破坏原有设计。
2.如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?
三、适用性
1.一个对象结构包含很多类对象,他们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2.需要对一个对象结构中的对象进行很多不同的并且不想关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式上每个应用仅包含需要用到的操作。
3.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
三、结构
五、效果
1.访问者模式使得易于增加新的操作。
2.访问者集中相关的操作而分离无关的操作。
3.增加新的ConcreteElement类很困难。
4.通过类层次进行访问。
5.累积状态。
6.破坏封装。
六、实现
1.双分派(Double-dispatch)。
2.谁负责遍历对象结构。
七、要点总结
1.Visitor模式通过所谓双重分发(double-dispatch)来实现在不更改(不添加新的操作-编译时),Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作(支持变化)。
2.所谓双重分发,即Visitor模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept方法的多态辨析;第二个为visitElementX方法的多态辨析。
3.Visitor模式的最大缺点在于扩展类层次结构(增添新的Element子类),会导致Visitor类的改变。因此Visitor模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”。
八、相关模式
Composit:访问者可以用于对一个由Composite模式定义的对象结构进行操作。
Interpreter:访问者可以用于解释器。
九、举例说明
不同的质检员分别抽样调查每个分厂的产品。
本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解