设计模式-访问者模式

20 阅读1分钟

定义

访问者模式,是一种行为设计模式,它允许在不修改已有代码的前提下,向对象结构中新增更多的操作。

它通过将操作封装在访问者对象中,实现对对象结构的操作。当需要对要给对象结构中的元素进行很多不同并且不相干的操作时,可以使用访问者模式来避免这些操作污染这些元素的类。

UML 类图

typescript 实现

1. 定义元素接口

interface Element {
  accept(visitor: Visitor): void;
}

2. 创建具体元素类

class ConcreteElementA implements Element {
  public accept(visitor: Visitor): void {
    visitor.visitElementA(this);
  }
  public operationA(): void {
    console.log("ConcreteElementA operation.");
  }
}

class ConcreteElementB implements Element {
  public accept(visitor: Visitor): void {
    visitor.visitElementB(this);
  }
  public operationB(): void {
    console.log("ConcreteElementB operation.");
  }
}

3. 定义访问者接口

interface Visitor {
  visitElementA(element: ConcreteElementA): void;
  visitElementB(element: ConcreteElementB): void;
}

4. 创建具体访问者类

class ConcreteVisitor1 implements Visitor {
  public visitElementA(element: ConcreteElementA): void {
    console.log("ConcreteVisitor1 visiting ConcreteElementA.");
    element.operationA();
  }
  public visitElementB(element: ConcreteElementB): void {
    console.log("ConcreteVisitor1 visiting ConcreteElementB.");
    element.operationB();
  }
}

class ConcreteVisitor2 implements Visitor {
  public visitElementA(element: ConcreteElmeentA): void {
    console.log("ConcreteVisitor2 visiting ConcreteElementA.");
    element.operationA();
  }
  public visitElementB(element: ConcreteElementB): void {
    console.log("ConcreteVisitor2 visiting ConcreteElementB.");
    element.operationB();
  }
}

5. 使用示例

const elements: Element[] = [
    new ConcreteElementA(),
    new ConcreteElementB(),
];

const visitor1: Visitor = new ConcreteVisitor1();
const visitor2: Visitor = new ConcreteVisitor2();

for (const element of elements) {
    element.accept(visitor1);
    element.accept(visitor2);
}

通用实现