訪問者モード:特定のデータ構造の各要素に作用するいくつかの操作をカプセル化します。このデータ構造を変更せずに、これらの要素に作用する新しい操作を定義できます。訪問者モードの構造図は次のとおりです。
上記の写真から、彼は次のキャラクターを持っていることがわかります。
抽象的な訪問者の役割:インターフェイスを定義し、1つ以上のアクセス操作を宣言します。
具体的な訪問者の役割:抽象的な訪問者によって宣言されたインターフェイス、つまり抽象的な訪問者が宣言されたさまざまなアクセス操作を実装します。
抽象要素(訪問可能)の役割:訪問者オブジェクトをパラメーターとして受け入れることを宣言します。
コンクリートエレメントの役割:抽象ノードによって指定された受け入れ操作を実装します。
データ構造オブジェクト(オブジェクト構造)の役割:構造内のすべての要素を通過し、訪問者オブジェクトが各要素にアクセスできるインターフェイスを提供できます。
シミュレーションコードは次のとおりです。
インターフェイスビジター{void Visit(Gladiolus G); void訪問(chrysanthemum c); } //コンクリートの訪問者名アクセスクラスStringVisitorはVisitor {String S; public string toString(){return s; } public void Visit(Gladiolus G){s = "Gladiolus"; } public void visit(chrysanteumum c){s = "chrysanteumum"; }} // Concrete Visitor Class Beevisitorは訪問者を実装します{Public Void Visit(Gladiolus G){System.out.println( "bee to actos flotion glagiolus"); } public void visit(chrysanteum c){system.out.println( "Bee to Access chrysanteum"); }}インターフェイスフラワー{void accept(visitor v); } / * *コンクリート要素chrysanthemumは花{public void accept(visitor v){v.visit(this); }} //コンクリート要素クラスのグラディオラスは花{public void accept(visitor v){v.visit(this); }} //これはフラワーオブジェクトジェネレータークラスFlowerGenerator {private static Random Rand = new Random();です。 public static Flower Newflower(){switch(rand.nextint(2)){default:case 0:return new Gladiolus();ケース1:新しいchrysanthemumを返します(); }}}パブリッククラステスト{ / * *最初に、クライアントで特定の訪問者の役割を取得します。オブジェクト構造は通過します。各要素の受け入れメソッドを呼び出し、特定の訪問者の役割を渡します。これにより、プロセス全体が完了します*/ public static void main(string args []){list <flower> flowers = new arraylist <flower>(); for(int i = 0; i <10; i ++)flower.add(flowergenerator.newflower()); Visitor Visitor = new StringVisitor(); iterator <flower> iterator = flowers.iterator(); while(iterator.hasnext()){iterator.next()。accept(visitor); System.out.println(訪問者); } system.out.println( "--------------------"); /**新しいアクセス動作:Beevisitor Bee Access*/ Visitor Visitor2 = new Beevisitor(); for(花の花:花){flower.accept(visitor2); }}}結果:
グラディオラスchrysanthemum chrysanthemum gladiolus chrysanthemum chrysanthemum chrysanthemum chrysanthemum gladiolus gladiolus ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
訪問者モードを考慮することができます。
1.オブジェクト構造には多くのクラスオブジェクトが含まれており、異なるインターフェイスがあり、これらのオブジェクト上の特定のクラスに依存する操作を実装する必要があります。
2。オブジェクト構造内のオブジェクトに対して多くの異なる操作を実行する必要があり、これらの操作がこれらのオブジェクトのクラスを「汚染」させることを避けたいです。訪問者を使用すると、関連する操作を集中し、クラスで定義できます。
3.オブジェクト構造が多くのアプリケーションで共有されている場合、Visitorモードを使用して、各アプリケーションを使用する必要がある操作のみを含めるようにします。
4.オブジェクト構造を定義するクラスはめったに変更されませんが、この構造を定義するには新しい操作がしばしば必要です。オブジェクト構造クラスを変更するには、すべての訪問者にインターフェイスを再定義する必要があります。これは大きなコストになります。オブジェクト構造クラスが頻繁に変更される場合は、これらのクラスでこれらの操作を定義する方が良い場合があります。
これらの個人は提案のようであり、特定の問題をプロジェクトで分析する必要があります。