非循环访问者模式( Acyclic Visitor)


意图
允许将新的函数功能添加到现有的类层次结构中,而不会影响这些层次结构,也不会创建GOF VISITOR模式所固有的麻烦的依赖循环。

适用性
何时可以使用此模式:

  • 当您需要向现有层次结构添加新的函数功能时,无需更改或影响该层次结构。
  • 当存在对层次结构进行操作但不属于层次结构本身的函数功能时。例如ConfigureForDOS / ConfigureForUnix / ConfigureForX问题。
  • 当您需要根据对象的类型对对象执行非常不同的操作时。
  • 当访问类层次结构经常被Element类的新派生进行扩展时。
  • 当重新编译,重新链接,重新测试或重新分配Element的新派生时非常昂贵。

后果
好处:

  • 类层次结构之间没有依赖循环。
  • 如果添加新访问者,则无需重新编译所有访问者。
  • 如果类层次结构具有新成员,则不会导致现有访问者中的编译失败。

坏处:
  • 违反了最小惊异原则或利斯科夫的替代原则,表明它可以接受所有访客,但实际上只对特定访客感兴趣。
  • 必须为可访问的类层次结构中的所有成员创建访问者的并行层次结构。