デザイン パターンに関する Gof ブックのビジター パターンの章から:
蓄積状態。ビジターは、オブジェクト構造の各要素にアクセスするときに状態を蓄積できます。ビジターがいない場合、この状態は、トラバーサルを実行する操作に追加の引数として渡されるか、グローバル変数として表示される可能性があります。
ここで状態を蓄積することで著者は何を意味し、状態の蓄積はどのように役立つのでしょうか? トラバーサル プロセス中に状態を蓄積することが役立つ実用的な例を挙げてください。
デザイン パターンに関する Gof ブックのビジター パターンの章から:
蓄積状態。ビジターは、オブジェクト構造の各要素にアクセスするときに状態を蓄積できます。ビジターがいない場合、この状態は、トラバーサルを実行する操作に追加の引数として渡されるか、グローバル変数として表示される可能性があります。
ここで状態を蓄積することで著者は何を意味し、状態の蓄積はどのように役立つのでしょうか? トラバーサル プロセス中に状態を蓄積することが役立つ実用的な例を挙げてください。
ビジター クラスにフィールドを追加して、そこに状態を保存できます。
例:
class MyVisitor implements Visitor {
private final List<Object> seenObjects = new ArrayList<Object>();
void visitFoo(Foo f) {
seenObjects.add(f);
}
void visitBar(Bar b) {
seenObjects.add(b);
}
}
ビジターに状態を保存することが「役立つ」とは言いません。操作を実行するために状態が必要な場合は、そこに置く必要があります。そうでない場合は、保存しないでください。
訪問者がいない場合、コードは通常次のようになります。
class MyHandler {
static void handle(Object o, List<Object> seenObjects) {
seenObjects.add(o);
if (o instanceof Foo) {
// ...
} else if (o instanceof Bar) {
// ...
}
// possibly a recursive call to handle() somewhere, passing the seenObjects list
}
}
別の方法は、ビジターの場合と同様に、状態をクラスのフィールドに格納することです。これはここでも可能ですが、訪問者パターンを使用しない場合は、状態をフィールドに入れることはあまり一般的ではないと思います (必要ではなく、通常はフィールドで変更可能な状態を回避することをお勧めします)。