Skip to content

访问者模式

意图

表示一个作用于某对象结构中各元素的操作,使可以在不改变各元素类的前提下定义作用于这些元素的新操作

类图

Java 示例

java
public interface ExprVisitor {
    int visitNumber(NumberExpr e);
    int visitAdd(AddExpr e);
}

public interface Expr {
    int accept(ExprVisitor v);
}

public class NumberExpr implements Expr {
    public final int value;
    public NumberExpr(int v) { this.value = v; }
    public int accept(ExprVisitor v) { return v.visitNumber(this); }
}

public class AddExpr implements Expr {
    public final Expr left, right;
    public AddExpr(Expr l, Expr r) { this.left = l; this.right = r; }
    public int accept(ExprVisitor v) { return v.visitAdd(this); }
}

public class EvalVisitor implements ExprVisitor {
    public int visitNumber(NumberExpr e) { return e.value; }
    public int visitAdd(AddExpr e) {
        return e.left.accept(this) + e.right.accept(this);
    }
}

// new AddExpr(new NumberExpr(1), new NumberExpr(2)).accept(new EvalVisitor()) => 3

编译器 AST、报表导出多类型节点时常用访问者;缺点是新增元素类型要改所有 Visitor。

进入第五篇:模式对比与选型