一.定义
封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素新的操作。
二.类图
- Visitor抽象访问者。抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问的。
- ConcreteVisitor具体访问者。定义访问者的访问逻辑。
- Element抽象元素。接口或者抽象类,声明接收哪一类访问者访问,程序上是通过accept方法中的参数来定义的。
- ConcreteElement具体元素。
- ObjectStruture结构对象。元素产生者,一般容纳在多个不同类,不同接口的容器。在项目中,一般很少抽象出这个角色。
三.优点
- 符合单一职责原则。具体元素角色负责数据的加载,Visitor类负责报表的展现,两个不同的职责非常明确地分离开来,各自演绎变化。
- 优秀的扩展性。
- 灵活性非常高。
四.缺点
- 具体元素对访问者公布细节。
- 具体元素变更比较困难。
- 违背了依赖倒置原则。
五.使用场景
访问者模式是迭代器模式的扩充,业务规则要求遍历多个不同的对象,针对访问对象的不同,执行不同的操作。访问者还有一个用途,就是充当拦截器角色。