访问者模式js实现
访问者模式概述
访问者模式是一种行为设计模式,允许在不修改对象结构的情况下定义新的操作。它将算法与对象结构分离,通过“访问者”对象实现多态行为。
核心组件
- Visitor(访问者):声明访问具体元素的接口(如
visitConcreteElementA)。 - ConcreteVisitor(具体访问者):实现访问者接口,定义具体操作逻辑。
- Element(元素):定义
accept方法,接收访问者对象。 - ConcreteElement(具体元素):实现
accept方法,调用访问者的对应方法。
JavaScript 实现示例
定义元素和访问者接口
// 元素接口
class Element {
accept(visitor) {
throw new Error("必须实现 accept 方法");
}
}
// 访问者接口
class Visitor {
visitElementA(element) {
throw new Error("必须实现 visitElementA 方法");
}
visitElementB(element) {
throw new Error("必须实现 visitElementB 方法");
}
}
实现具体元素
class ConcreteElementA extends Element {
accept(visitor) {
visitor.visitElementA(this);
}
operationA() {
return "ConcreteElementA 的操作";
}
}
class ConcreteElementB extends Element {
accept(visitor) {
visitor.visitElementB(this);
}
operationB() {
return "ConcreteElementB 的操作";
}
}
实现具体访问者
class ConcreteVisitor extends Visitor {
visitElementA(element) {
console.log(`访问者处理 ElementA: ${element.operationA()}`);
}
visitElementB(element) {
console.log(`访问者处理 ElementB: ${element.operationB()}`);
}
}
使用示例
const elements = [new ConcreteElementA(), new ConcreteElementB()];
const visitor = new ConcreteVisitor();
elements.forEach(element => {
element.accept(visitor);
});
输出结果
访问者处理 ElementA: ConcreteElementA 的操作
访问者处理 ElementB: ConcreteElementB 的操作
应用场景
- 需要对复杂对象结构(如 AST、DOM)执行多种独立操作时。
- 避免污染对象类的代码,将相关行为集中到访问者中。
优缺点
优点:
- 符合开闭原则,新增操作只需添加访问者。
- 算法与对象结构解耦。
缺点:
- 元素类需暴露足够细节,可能破坏封装。
- 频繁增删元素类时需修改所有访问者。







