Предположим, у меня есть составной иерархии представлять регулярные как выражения, например:Как ссылаться на субрезультаты при использовании шаблона посетителя?
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);
}
Вопрос в том, как я могу осуществить операции, необходимые для обхода дерева и вычисления результатов рекурсивно, например:
- сериализации регулярное выражение для строки,
- оценить регулярное выражение к набору последовательностей,
- ...
Предположим, например, следующую реализацию Visitor:
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);
}
}
...
}
Чтобы вычислить результат при любом заданном уровне дерева, мне нужно знать, суб-результаты на нижних уровнях. В идеале мне нужен метод для возврата вычисленного результата. Однако это не представляется возможным, поскольку отдельные операции могут возвращать результаты другого типа.
Единственное решение, которое приходит мне на ум, заключается в том, чтобы кэшировать субрезультаты вручную на карте класса посетителей. Это кажется очень громоздким.
Является ли посетителем подходящий шаблон в этом случае? Что было бы подходящей реализацией?
Вы можете сделать своих посетителей строителями и получить окончательный результат, когда они будут сделаны. –