Visitorパターン(Vistor):
Visitorパターンの正式な定義はこれです:操作は、オブジェクト構造の効果の各要素は、それはあなたがこれらの要素の動作中に新しいクラスの役割の前提の下での要素の定義を変更することはできませんになります。公式物事はあいまいです、私たちは今、解体に見ることができます:オブジェクトの構造、要素、操作:まず第一に、「操作の対象構造の役割の要素は、」三つのことを指します。私たちは、あなたがデータにアクセスするデータ構造、データ構造は、一般的にそのアドレスに直接アクセスしている研究してきました。オブジェクト指向設計では、我々は一般的に簡単にアクセスするための内部クラス上のデータアクセス動作、です。この設計では問題はないようですが、私たちはさまざまな方法を使用したいときには、このようなデータ構造やオブジェクト、違反にアクセスするために、クラスを変更する必要があるOCPの原則を。だから我々は、新しいクラスを追加する際に、直接アクセス操作を追加する必要があり、誰尋ね分離されたデータ構造と操作、と思う、元のコードを変更することはできません」、また、最後の部分に記載されているすべての変更を行う必要はありません。これらの要素の動作の新しいクラスの前提の下で、各要素の役割の定義。 "
役割のVisitorパターン:
1)訪問者:要素がアクセスされる各要素について、その動作パラメータを定義するインターフェースまたは抽象クラスは、その要素の数と理論的方法の数は、従って、ビジターモードが必要と同じであり、アクセスされ安定化する要素のタイプは、しばしば追加、除去要素クラス場合、必然的にこの場合は、次にモードが適切でない、頻繁な変更の訪問者インターフェイスにつながります。
2)ConcreteVisitor:特定の訪問者は、それが生成されたアクセスのすべてのタイプに対して特定の要素を与える必要があります。
3)要素:方法(受け入れる)すべての要素の訪問者をアクセスすることができることを意味し、訪問者を受け取るを定義する要素インターフェースまたは抽象クラス。
4)ConcreteElement:インタビューの特定の実装を提供するコンクリート要素のクラスが、この方法は、通常提供訪問者へのアクセス権を持つ要素クラスを具現化されます。
5)ObjectStructure:上記構成オブジェクト定義は、オブジェクトの構造を抽象的表現、内部管理要素の集合であり、要素は、訪問者を提供反復することができます。
例:
フォルダとファイルのディレクトリがあり、フォルダやファイルは、クラスの特定の要素があります。
1 /// <まとめ> 2人の /// 抽象訪問者 3。 /// </要約> 4。 パブリック 抽象 クラス訪問者 5。 { 6。 パブリック 抽象 ボイド訪問(ファイルファイル); 7 。8 パブリック 抽象 ボイド訪問(ディレクトリのディレクトリ)。 9 } 10 。11 /// <概要> 12である /// 詳細な訪問者 13である /// </要約> 14 パブリック クラスListVisitor:ビジター 15 { 16 公共 オーバーライド ボイド訪問(ファイルファイル) 。17 { 18は、 Console.WriteLineを($ " ファイル名file.GetName {()} " ); 19 } 20が 21である 公共 オーバーライド ボイド訪問(ディレクトリディレクトリ) 22がある { 23は Console.WriteLineを($ " directory.GetNameフォルダ名{()} " ); 24 } 25 } 26は 27 /// <まとめ> 28 /// 要素抽象クラス 29 /// </要約> 30 パブリック 抽象 クラスエレメント 31 { 32 パブリック 抽象 ボイドは(ビジター訪問者)を受け入れます。 33 } 34 35 パブリック クラスエントリ:要素 36 { 37 プライベート 文字列名。 38 39 公共のエントリ(列名) 40 { 41 この .nameの= 名前。 42 } 43 44 公共の 文字列関連項目GetName() 45 { 46 リターン この.nameの; 47 } 48 49 公共 オーバーライド ボイド受け入れ(ビジターヒット) 50 { 51が スロー 新しい新しいNotImplementedException(); 52である } 53である } 54が 55 /// <まとめ> 56である /// コンクリート要素クラス:フォルダ 57 / // </要約> 58 パブリック クラスディレクトリ:エントリ 59 { 60 パブリックディレクトリ(文字列名) 61である :ベース(名前) 62は 、{ 63である } 64 65 公共 オーバーライド ボイド受け入れ(ビジターヒット) 66 { 67 visitor.visit(この); 68 } 69 } 70 71である /// <まとめ> 72 /// コンクリート要素クラス:ファイル 73 /// </要約> 74 パブリック クラスファイル:エントリ 75 { 76 パブリックファイル(文字列名) 77 :ベース(名前) 78 { 79 } 80 81 公共 オーバーライド ボイドは(ビジタービジター)受け入れ 82 { 83 visitor.visit(この)。 84 } 85 }
定義され、データ操作、我々はデータ構造を定義ObjectStructure次のコアクラス。
1 パブリック クラスObjectStructure 2 { 3 プライベート 読み取り専用ビジタービジター; 4 プライベートリスト<要素>リスト= 新しいリスト<要素> (); 5 6 公共ObjectStructure(ビジタービジター) 7 { 8 本 .visitor = ビジター。 9 } 10 11 公共 ボイド追加(element要素) 12 { 13 list.Add(要素) 14 } 15 16 公衆 ボイド表示() 17 { 18 のforeach(element要素内のリスト) 19 { 20 element.accept(訪問者)。 21 } 22 } 23 }
クライアントが呼び出します。
1つの プライベート 静的 ボイドメイン(文字列[]引数) 2 { 3。 ObjectStructure objectStructure = 新しい新しい ObjectStructure(新しい新しいListVisitor()); 4 objectStructure.Add(新しい新しいディレクトリ(" マイフォルダ" )); 5 objectStructure.Add(新しい新しいファイル(" C#は、プログラミング.PDFを前進" )); 6 objectStructure.Add(新新ファイル(" デザインパターン.PDF " )); 7 objectStructure.Addを(新しい新ファイル(" 算法.TXT " )); 8 objectStructure.Add(新しいファイル(" mm.png " )); 9 objectStructure.Show()。 10 }
強みと弱みのVisitorパターン:
利点:
1)に沿った職務の各分離の役割、単一責任の原則。
2)優れた拡張性を有し、その結果、データ構造とデカップリング構造に作用する操作、独立して変化させることができる操作のセット。
3)柔軟性
短所:
1)お客様の特定の要素は、違反の詳細を発表しましたDimmit原理を。
2)変化の特定の要素は、より難しいです。
3)違反依存反転原理を私たちは抽象化に依存しない特定のクラスに依存しています、。
シーンモードを使用して訪問者:
1)オブジェクトクラス構造に対応するオブジェクトはほとんど変化しないが、多くの場合、オブジェクト構造に新しい操作を定義する必要があります。
2)ターゲット・オブジェクト構造の動作と異なると無関係の多くの必要性、およびこれらのアクションは、これらのオブジェクトの「汚染」クラスを避けるために必要がある、我々は新しい操作を追加する際に、これらのクラスを変更する必要はありません。