2011-07-25 9 views
1

私は現在の問題に必要な正しいアプローチ(およびパターン)を理解しようとしています。すべてが訪問者のパターンに向かって私を導いているようだし、ウィキペディアの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); 
    } 
} 
+0

を訪問者がユニークだった場合は、各車の要素クラスの静的な値としてそのを格納することができます。フロントガラスがプリント客でも訪れることができたからではないようです。おそらくそれぞれの具体的な訪問者クラスには、許可された具体的な訪問者のセットがあります。逆もまた同様です。 は訪問客のサブクラスであるウォッシュ・ビジターですか? –

+0

正しいですが、訪問者は実際には春に注入されたコンポーネントです。必ずしもDoVisitorのサブクラスである必要はなく、単にCarElementVisitorを実装する必要があります。 –

答えて

1

これは何か?

class FindTheRightVisitorVisitor implements CarElementVisitor { 
    private CarElementVisitor theVisitor; 
    ... getter etc ... 
    void visit(Windshield w) { 
     if (theVisitors == null) { 
      theVisitors = new CarElementWashVisitor(); 
     } 
    } 
} 

そして、ここで使用します。

CarElement root = ...; 
CarElementVisitor findIt = new FindTheRightVisitorVisitor(); 
root.accept(findIt); 
CarElementVisitor theRightVisitor = findIt.getTheVisitor(); 
root.accept(theRightVisitor); 
+0

ええ、これは実際に私が必要とする以上のものです。訪問者が1人の訪問者(各タイプのメソッドを持つ)を持つだけで、訪問者は実際のロジックを呼び出すか、委任します。ポイント。ありがとう! –

関連する問題