Appearance
访问者模式
意图
表示一个作用于某对象结构中各元素的操作,使可以在不改变各元素类的前提下定义作用于这些元素的新操作。
类图
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。
进入第五篇:模式对比与选型