複合デザインパターンで作成された式があります:
interface TreeExpression{
void accept(Visitor visitor);
}
abstract class Operator{
TreeExpression childA;
TreeExpression childB;
Operator(TreeExpression a, TreeExpression b){
this.childA = a;
this.childB = b;
}
}
class PlusTreeExpression extends Operator implements TreeExpression{
public PlusTreeExpression(TreeExpression a, TreeExpression b) {
super(a, b);
}
public void accept(Visitor visitor) {
this.childA.accept(visitor);
visitor.visit(this);
this.childB.accept(visitor);
}
}
class MultiplyTreeExpression extends Operator implements TreeExpression{
public MultiplyTreeExpression(TreeExpression a, TreeExpression b) {
super(a, b);
}
public void accept(Visitor visitor) {
this.childA.accept(visitor);
visitor.visit(this);
this.childB.accept(visitor);
}
}
class IntegerNode implements TreeExpression{
Integer value;
IntegerNode(int v){
this.value = v;
}
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
式から文字列を取得するためのビジター:
interface Visitor{
void visit(PlusTreeExpression tree);
void visit(MultiplyTreeExpression tree);
void visit(IntegerNode node);
}
class PrintVisitor implements Visitor{
public StringBuffer result = new StringBuffer();
public void visit(IntegerNode node) {
result.append(node.value);
}
public void visit(PlusTreeExpression tree) {
result.append("+");
}
public void visit(MultiplyTreeExpression tree) {
result.append("*");
}
このビジターは機能し、評価式のビジターを作成しようとしていますが、ここで問題があります。私はそれを行う方法をいくつか試しましたが、既存のコードを変更せずに子ツリーからルートに値を取得する方法がわかりません。