17.访问者模式
访问者模式(Visitor Pattern)的主要目的是把“数据结构”和“作用于数据结构的操作”分离,便于在不修改元素类的情况下新增操作
适合使用访问者模式的场景
- 对象结构相对稳定,但操作会频繁新增
- 一个对象结构需要支持多种处理逻辑(计算、导出、校验)
- 希望避免把各种操作都堆在元素类里
- 需要集中管理同一类操作逻辑
元素与访问者接口
interface Visitor {
visitNumber(node: NumberNode): number;
visitAdd(node: AddNode): number;
}
interface Node {
accept(visitor: Visitor): number;
}具体元素与访问者实现
class NumberNode implements Node {
constructor(public value: number) {}
accept(visitor: Visitor): number {
return visitor.visitNumber(this);
}
}
class AddNode implements Node {
constructor(
public left: Node,
public right: Node,
) {}
accept(visitor: Visitor): number {
return visitor.visitAdd(this);
}
}
class EvalVisitor implements Visitor {
visitNumber(node: NumberNode): number {
return node.value;
}
visitAdd(node: AddNode): number {
return node.left.accept(this) + node.right.accept(this);
}
}使用示例
const ast = new AddNode(
new NumberNode(10),
new AddNode(new NumberNode(2), new NumberNode(3)),
);
const result = ast.accept(new EvalVisitor());
console.log(result); // 15