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

  1. // 访问者
  2. class Visitor {
  3. constructor() {}
  4. visitConcreteElement(ConcreteElement) {
  5. ConcreteElement.operation()
  6. }
  7. }
  8. // 元素类
  9. class ConcreteElement{
  10. constructor() {
  11. }
  12. operation() {
  13. console.log("ConcreteElement.operation invoked");
  14. }
  15. accept(visitor) {
  16. visitor.visitConcreteElement(this)
  17. }
  18. }
  19. // client
  20. let visitor = new Visitor()
  21. let element = new ConcreteElement()
  22. element.accept(visitor)

场景例子

  • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作
  • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作”污染”这些对象的类,也不希望在增加新操作时修改这些类。

    优点

  • 符合单一职责原则

  • 优秀的扩展性
  • 灵活性

    缺点

  • 具体元素对访问者公布细节,违反了迪米特原则

  • 违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
  • 具体元素变更比较困难