【发布时间】:2014-12-20 21:12:01
【问题描述】:
假设我有一个复合层次结构来表示正则表达式,如下所示:
public abstract class Expression {
public abstract void accept(Visitor visitor);
}
public class Identifier extends Expression {
public final String token;
public Identifier(String token) {
this.token = token;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getToken() {
return token;
}
}
public class Sequence extends Expression {
private final List<Expression> subExprs;
public Sequence(List<Expression> subExprs) {
this.subExprs = new ArrayList<Expression>(subExprs);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public List<Expression> getSubExprs() {
return subExprs;
}
}
...
public abstract class Visitor {
public abstract void visit(Identifier identifier);
public abstract void visit(Sequence sequence);
}
问题是,如何实现需要爬树并递归计算结果的操作,如:
- 将正则表达式序列化为字符串,
- 将正则表达式评估为一组序列,
- ...
假设例如以下访问者实现:
public class Serialize extends Visitor {
public void visit(Sequence sequence) {
for (Expression subExpr : sequence.getSubExprs()) {
// here, I don't have any means to access the sub-results
subExpr.accept(visitor);
}
}
...
}
要计算树的任何给定级别的结果,我需要知道以下级别的子结果。理想情况下,我需要 accept 方法来返回计算结果。不过,这似乎是不可能的,因为个别操作可能会返回不同类型的结果。
我想到的唯一解决方案是将子结果手动缓存在访问者类的地图中。不过,这似乎很麻烦。
在这种情况下,Visitor 是一个合适的模式吗?什么是合适的实现方式?
【问题讨论】:
-
您可以让您的访问者成为建设者,并在他们完成后得到他们的最终结果。
标签: java design-patterns visitor-pattern