C++(设计模式):27---行为型模式之访问者模式(Visitor)

行为型模式概述

  • 行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻划了在运行时难以跟踪的复杂的控制流。它们将你的注意 力从控制流转移到对象间的联系方式上来
  • 行为类模式使用继承机制在类间分派行为。其中包括两个这样的模式:
    • 其中TemplateMethod较为简单和常用。模板方法是一个算法的抽象定义,它逐步地定义该算法, 每一步调用一个抽象操作或一个原语操作,子类定义抽象操作以具体实现该算法
    • 另一种行为类模式是Interpreter。它将一个文法表示为一个类层次,并实现一个解释器作为这些类的实例上的一个操作
  • 行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样 相互协作以完成其中任一个对象都无法单独完成的任务。这里一个重要的问题是对等的对象 如何互相了解对方。对等对象可以保持显式的对对方的引用,但那会增加它们的耦合度。在 极端情况下,每一个对象都要了解所有其他的对象。 Mediator在对等对象间引入一个mediator对象以避免这种情况的出现。mediator提供了松耦合所需的间接性
  • Chain of Responsibility提供更松的耦合。它让你通过一条候选对象链隐式的向一个对 象发送请求。根据运行时刻情况任一候选者都可以响应相应的请求。候选者的数目是任意的, 你可以在运行时刻决定哪些候选者参与到链中
  • Observer模式定义并保持对象间的依赖关系。典型的Observer的例子是Smalltalk中的模型/视图/控制器,其中一旦模型的状态发生变化,模型的所有视图都会得到通知
  • 其他的行为对象模式常将行为封装在一个对象中并将请求指派给它:
    • Strategy模式将 算法封装在对象中,这样可以方便地指定和改变一个对象所使用的算法
    • Command模式 将请求封装在对象中,这样它就可作为参数来传递,也可以被存储在历史列表里,或者以其 他方式使用
    • State模式封装一个对象的状态,使得当这个对象的状态对象变化时,该对象可改变它的行为
    • Visitor封装分布于多个类之间的行为
    • 而Iterator则抽象了访问 和遍历一个集合中的对象的方式
  • 行为型模式有:

一、意图

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

二、动机

  • 待续

三、适用性

  • 在下列情况下使用Visitor模式:
    • 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于 其具体类的操作
    • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操 作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作
    • 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那 么可能还是在这些类中定义这些操作较好

四、结构

五、参与者

  • Visitor(访问者):为该对象结构中ConcreteElement的每一个类声明一个 Vi s i t操作。该操作的名字和特 征标识了发送Visitor请求给该访问者的那个类。这使得访问者可以确定正被访问元素 的具体的类。这样访问者就可以通过该元素的特定接口直接访问它
  • ConcreteVisitor(具体访问者):实现每个由Visitor声明的操作。每个操作实现本算法的一部分,而该算法片断乃是 对应于结构中对象的类。ConcreteVisitor为该算法提供了上下文并存储它的局部状态。 这一状态常常在遍历该结构的过程中累积结果
  • Element(元素):定义一个Accept操作,它以一个访问者为参数
  • ConcreteElement(具体元素):实现Accept操作,该操作以一个访问者为参数
  • ObjectStructure(对象结构):
    • 能枚举它的元素
    • 可以提供一个高层的接口以允许该访问者访问它的元素
    • 可以是一个复合(参见Composite)或是一个集合,如一个列表或一个无序集 合。

六、协作

  • 一个使用Visitor模式的客户必须创建一个ConcreteVisitor对象,然后遍历该对象结构, 并用该访问者访问每一个元素
  • 当一个元素被访问时,它调用对应于它的类的Visitor操作。如果必要,该元素将自身作 为这个操作的一个参数以便该访问者访问它的状态
  • 下面的交互框图说明了一个对象结构、一个访问者和两个元素之间的协作。

七、效果

  • 待续(学习到的时候再回来补)

八、实现

  • 待续(学习到的时候再回来补)

九、代码示例

  • 待续(学习到的时候再回来补)

十、相关模式

  • Composite:访问者可以用于对一个由Composite模式定义的对象结构进行操作
  • Interpreter:访问者可以用于解释。