Skip to content

访问者模式 (Visitor Pattern)

访问者模式 (Visitor Pattern) 是一种将算法与操作对象结构分离的设计模式^[600-developer__23种设计模式.md]。作为 23种经典设计模式 之一,它属于 行为型模式 (Behavioral Pattern)^[600-developer__23种设计模式.md]。

该模式的核心目的是允许在不修改现有对象结构的前提下,定义作用于这些对象的新操作^[600-developer__23种设计模式.md]。通过将相关的操作封装在一个称为“访问者” (Visitor) 的类中,它可以遍历对象结构中的元素,并对每个元素执行特定的操作^[600-developer__23种设计模式.md]。

核心结构

访问者模式主要包含以下两种类型的角色^[600-developer__23种设计模式.md]:

  • 访问者: 声明了一组访问操作,用于对具体元素进行操作。通常,每个操作对应于具体结构中的一种元素类型^[600-developer__23种设计模式.md]。
  • 元素: 定义一个 accept 方法,该方法接受一个访问者对象作为参数^[600-developer__23种设计模式.md]。

这种结构利用了 双重分派 (Double Dispatch) 的机制:元素将访问者作为参数传递给自己的 accept 方法,而访问者随后将自己作为参数传递给元素的 visit 方法[600-developer__23种设计模式.md]。这使得新增的操作(即新的访问者)可以独立于元素的类层次结构而变化[600-developer__23种设计模式.md]。

优缺点

  • 优点:
    • 符合单一职责原则: 将原本属于对象内部的行为逻辑提取到独立的访问者类中^[600-developer__23种设计模式.md]。
    • 优秀的扩展性: 如果需要新增操作,只需添加一个新的访问者类,而无需修改现有的对象结构类^[600-developer__23种设计模式.md]。
    • 灵活性: 访问者可以针对不同的元素类型提供不同的实现逻辑^[600-developer__23种设计模式.md]。
  • 缺点:
    • 增加元素困难: 如果在对象结构中增加新的元素类型,意味着需要在所有访问者类中添加对应的新操作,修改成本较高^[600-developer__23种设计模式.md]。
    • 依赖倒置: 具体元素通常需要暴露内部细节给访问者,这在一定程度上破坏了对象的封装性^[600-developer__23种设计模式.md]。
    • 行为集中: 所有相关行为都集中在访问者中,如果访问者本身过于复杂,可能会降低系统的可维护性^[600-developer__23种设计模式.md]。

适用场景

  • 当一个对象结构包含多个类型的对象,特别是这些对象类型相对固定,但需要对这些对象执行多种不同的、复杂的操作时^[600-developer__23种设计模式.md]。
  • 当需要对一个对象结构中的对象进行很多不同并且不相关的操作,而为了避免这些操作“污染”这些对象的类时^[600-developer__23种设计模式.md]。
  • 当对象结构被多个应用共享时,使用访问者模式可以让每个应用仅包含自己用到的操作^[600-developer__23种设计模式.md]。

Sources

  • 600-developer__23种设计模式.md