私は現在の問題に必要な正しいアプローチ(およびパターン)を理解しようとしています。すべてが訪問者のパターンに向かって私を導いているようだし、ウィキペディアのexampleは私が必要とするものとほぼ同じです。しかし、私の問題は、私がデータベースからこれらのCarElement
を取得しており、私が求めたCarElement
のタイプに応じて正しい訪問者を作成する必要があるということです。たとえば、Windshield
のリストを取得した場合は、CarElementWashVisitor
を渡します。私はここのパターンに逆らっているように感じますが、サブクラスのタイプをチェックしなければ正しいアプローチが何であるか分かりません。私は基本的にオブジェクトの実行時の型に基づいて何をすべきかを理解するために何らかの方法が必要です。ここで私は上記にリンクされているウィキペディアの例の要約部分があります:ビジターのタイプがvisiteeのタイプに依存する場合のJava訪問者パターン
interface CarElementVisitor {
void visit(Wheel wheel);
void visit(Engine engine);
void visit(Body body);
void visit(Car car);
}
interface CarElement {
void accept(CarElementVisitor visitor); // CarElements have to provide accept().
}
class CarElementPrintVisitor implements CarElementVisitor { /**/ }
class CarElementDoVisitor implements CarElementVisitor { /**/ }
UPDATE:(以下の受け入れ答えによって示されるように)
は問題は実際にはかなり簡単であることが判明しました。ここで私が探していたもの:
class MyVisitor implements CarElementVisitor {
private MyService carwashService;
/* visit(Wheel w), visit(Engine e)... etc */
void visit(Windshield w) {
carwashService.wash(w);
}
}
を訪問者がユニークだった場合は、各車の要素クラスの静的な値としてそのを格納することができます。フロントガラスがプリント客でも訪れることができたからではないようです。おそらくそれぞれの具体的な訪問者クラスには、許可された具体的な訪問者のセットがあります。逆もまた同様です。 は訪問客のサブクラスであるウォッシュ・ビジターですか? –
正しいですが、訪問者は実際には春に注入されたコンポーネントです。必ずしもDoVisitorのサブクラスである必要はなく、単にCarElementVisitorを実装する必要があります。 –