访问者模式js实现
访问者模式概述
访问者模式是一种行为设计模式,允许在不修改对象结构的情况下定义新操作。它将算法与对象结构分离,通过将操作封装在“访问者”对象中实现。
适用场景
- 需要对复杂对象结构(如树形结构)执行多种不相关的操作。
- 需避免污染对象类代码,保持职责单一。
JavaScript实现步骤
定义对象结构(元素类)
元素类需包含accept方法,接收访问者对象并调用其方法:
class ElementA {
accept(visitor) {
visitor.visitElementA(this);
}
operationA() {
return 'ElementA operation';
}
}
class ElementB {
accept(visitor) {
visitor.visitElementB(this);
}
operationB() {
return 'ElementB operation';
}
}
定义访问者接口
访问者需为每个元素类实现对应的访问方法:
class Visitor {
visitElementA(element) {
throw new Error('Must implement visitElementA');
}
visitElementB(element) {
throw new Error('Must implement visitElementB');
}
}
实现具体访问者
继承访问者接口,实现具体操作逻辑:
class ConcreteVisitor1 extends Visitor {
visitElementA(element) {
console.log(`ConcreteVisitor1: ${element.operationA()}`);
}
visitElementB(element) {
console.log(`ConcreteVisitor1: ${element.operationB()}`);
}
}
class ConcreteVisitor2 extends Visitor {
visitElementA(element) {
console.log(`ConcreteVisitor2: ${element.operationA()}`);
}
visitElementB(element) {
console.log(`ConcreteVisitor2: ${element.operationB()}`);
}
}
客户端使用示例
组合对象结构并应用不同访问者:

const elements = [new ElementA(), new ElementB()];
const visitor1 = new ConcreteVisitor1();
const visitor2 = new ConcreteVisitor2();
elements.forEach(element => {
element.accept(visitor1);
element.accept(visitor2);
});
关键点
- 双分派机制:通过
accept和visit方法实现两次动态分配,确定具体操作。 - 扩展性:新增操作只需添加访问者类,无需修改元素类。
- 缺点:元素类需暴露足够细节,可能破坏封装性。
变体与优化
- 若元素类稳定但操作频繁变化,访问者模式更合适。
- 可使用组合模式处理树形结构的递归访问。





