定义
访问者模式,是一种行为设计模式,它允许在不修改已有代码的前提下,向对象结构中新增更多的操作。
它通过将操作封装在访问者对象中,实现对对象结构的操作。当需要对要给对象结构中的元素进行很多不同并且不相干的操作时,可以使用访问者模式来避免这些操作污染这些元素的类。
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);
}
通用实现
无