访问者模式

访问者模式

【作用】:操作复杂对象结构

结构图

访问者模式

  • Visitor(抽象访问者):抽象访问者为对象结构中每一个具体元素类ConcreteElement声明一 个访问操作,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。
  • ConcreteVisitor(具体访问者):具体访问者实现了每个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型的元素。
  • Element(抽象元素):抽象元素一般是抽象类或者接口,它定义一个accept()方法,该方法通常以一个抽象访问者作为参数。
  • ConcreteElement(具体元素):具体元素实现了accept()方法,在accept()方法中调用访问者的访问方法以便完成对一个元素的操作。
  • ObjectStructure(对象结构):对象结构是一个元素的集合,它用于存放元素对象,并且提供了遍历其内部元素的方法。它可以结合组合模式来实现,也可以是一个简单的集合对象, 如一个List对象或一个Set对象。

优缺点

优点
  • 增加新的访问操作很方便。
  • 将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个的元素类中。 类的职责更加清晰,有利于对象结构中元素对象的复用。
缺点
  • 增加新的元素类很困难。
  • 破坏封装。

应用场景

  • 一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个访问操作,不同类型的对象可以有不同的访问操作。
  • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作。
  • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。