意图:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的操作。
动机:在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类代理很繁重的变更负担,甚至破坏原有设计。
适用性:
一个对象结构含有很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于具体类的操作
需要对一个对象结构中的对象进行很多不同而且不相关的操作,而你想避免让这些操作“污染“这些类对象。
定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。
结构:
参与者:
Visitor: 为该对象结构中ConcreteElement的每一个类声明一个Visit操作
ConcreteVisitor: 实现每个由Visitor声明的操作
Element : 定义一个Accept操作,它以一个访问者为参数
ConcreteElement:实现一个Accept操作,该操作以一个访问者为参数
ObjectStructure: 能枚举它的元素,可以提供一个高层接口以允许访问者访问它的元素;可以是一个组合或者是一个集合。
协作:
一个使用Visitor模式的客户必须创建一个ConcreteVisitor对象,然后遍历该对象结构,并用该访问者访问每一个元素
当一个元素被访问时,它调用对应于它的类的Visitor操作。
效果:
访问者模式使得易于增加新的操作
访问者集中相关的操作而分离无关的操作
增加新的ConcreteElement类很困难
通过该类层次进行访问
累积状态
破坏封装
实现:
代码示例如下:
1 |
|