目录
[显示]

1.摘要

Visitor模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。简单的说,它分离了“遍历”和“操作”。

2. 针对问题

当我们需要遍历一个结构并且操作这个这个结构中的对象时,可能会写出这样的代码:

这样如果我们需要修改对element元素的操作时,需要重写整个循环。同样,如果我们要修改遍历元素的算法,也需要改写这个循环。
Visitor模式分离了对象结构的“遍历”和“对象操作”,使得这两种逻辑可以分别被修改。

3. 介绍

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

4. 实现

Visitor模式的静态图如下:

由UML图可以看出Visitor模式有两个类层次:一个对应于接受操作元素(遍历),一个用于定义对元素操作的访问者(操作)。

下面的协作图进一步说明了Visitor模式的协作方式:

1、遍历可以由对象结构、访问者、或独立的迭代器完成。
2、对每一个对象调用Accept(Visitor),传入Visitor实例
3、在Accept中通过调用visitor的函数并传入自身指针,由Visitor实现具体算法。

5. 特点

1、Visitor模式的主要优点是剥离了对于复杂对象结构的共有操作,新增或修改共有操作时只需要新增或修改一个Visitor类,而不用修改元素继承层次中的多个类。
2、Visitor模式也有缺点,对于上面的UML图来说就是Element派生类的Operate是不确定的,每增加一种Element就需要在Visitor中增加相应类型的Visit函数(对应图中的VisitConcreteElementA和VisitConcreteElementB)。

6. 相关文章

1、设计模式总结

7. 参考文章

  1. 《设计模式_可复用面向对象软件的基础》,