概念:访问者模式是一个相对比较简单,但是结构又比较复杂的一种设计模式,它讲的是一种作用于某对象结构的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,主要将数据结构与数据操作进行分离
访问者模式的基本工作原理:在被访问者的类里加一个对外提供接待访问者的接口
UML类图:
Visitor:抽象访问者,用于声明访问者可以访问哪些元素,可以由抽象类或接口来表示
ConcreteVisitor:具体访问者,用来实现访问者定义的方法或者说具体实现抽象访问者定义的操作
Element:数据结构对象,这个对象提供了一个方法来让访问者调用
ConcreteElement:具体的数据结构对象,实现具体方法
ObjectStruct:结构对象,可以简单的理解为,在这个对象里面将访问者与数据结构对象进行组合
Client:客户端,实现对结构对象和访问者的调用
下面通过项目场景来简单用代码表示一下:
歌手评分项目,现在有两个评分,成功和失败,而参加的人员类别分为男人和女人,当然也可以进行细致的划分,比如说中年、青年、老年、小孩等
代码实例:
Visitor:
Element:
ConcreteVisitor:
ConcreteElement:
ObjectStruct:
Client:
运行结果:
- 优点
符合单一职责原则
优秀的扩展性
灵活性非常高 - 缺点
具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的
具体元素变更比较困难
违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素 - 使用场景
一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖与其具体类的操作,也就是用迭代器模式已经不能胜任的情景
需要对一个对结构中的对象进行很多不同并且不相关的操作,而你想避免让这些操作“污染”这些对象