设计模式——访问者模式
一、概念:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
二、UML示意图
Visitor抽象类定义了访问每一个不同元素类型的接口,每一个具体访问者继承自这个抽象类并实现这些访问元素的方法。ConcreteElement继承自抽象Element类并实现Accept方法来执行ConcreteVisitor中对应自己元素类型的操作VisitConcreteElement方法。这其实是一种双访问的技术,ConcreteVisitor访问ConcreteElement,而ConcreteElement又根据自己的元素类型调用ConcreteVisitor中对应的VisitConcreteElement方法。而ObjectStructure类则持有一个Element列表,通过Attach和Detach方法新增和移除Element,并可以通过Accept方法传入一个Visitor而遍历这个Element列表使每一个Element对象访问这个Visitor。
在访问者模式中,数据结构一般是稳定的,也就是访问者Visitor中需要访问的ConcreteElement类是稳定的,否则当新增类型的时候,抽象Visitor要加一个访问新元素类型的接口并且每一个ConcreteVisitor都要新增一个新的访问这个新增元素类型的方法。这就违背了开闭原则,并且当ConcreteVisitor很多时修改量会很大。
三、优缺点
优点:
- 各角色职责分离,符合单一职责原则
- 使得数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化。
- 具有优秀的扩展性,要新增新的对数据结构的操作只需要新增新的ConcreteVisitor类就可以了
缺点:
- 增加新的元素类型会很困难,因为每加一个新的元素类型,每一个Visitor类都要新增加一个对一个这个元素类型的访问方法。
- 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的。
- 应用场景较少,因为要在元素类型稳定的情形下才适用,但实际上很多时候是需要变更或增加元素类型的。