行動デザインパターン:関心事の分離とオブジェクトの振る舞い
オブザーバー:何かが起こる内のオブジェクト後の溶液は、それがアクション他の一連のオブジェクトをトリガーするされ、その後、我々は、オブジェクト間の依存関係をクローズする必要はありません
実行ミャオ族の方法は、一連のアクションをトリガーする場合は、そのクラスと呼ばれる猫があります
1つの パブリック クラス猫 2 { 3 公共 ボイドミャオ() 4 { 5 Console.WriteLineを(" {0}ミャオ..... "、この.GetType()の名前。); 6 7 新しい犬()王(3 ); 8 // 新しいマウス()を実行します()。 9 新しいチキン()ウー(); 10 新しい。ベイビー()クライ(); 11 新しいブラザー()(回します)。 12 新しい。父()咆哮(); 13 新。母()ウィスパー(); 14 // 新しいマウス()を実行します()。 15 新しい近隣()アウェイク()。 16 新盗む()(非表示)。 17 } 18 19 }
しかし、これは、ほとんどのアクションまたはアクションプラス要件が実行する場合ので、カップリングが生じ、その後、またはメソッド呼び出しの名前を変更する必要があり、キャッツ、あまりにも面倒で修正する必要がありますどの
したがって、この場合には、この問題を解決するための普遍的な方法であるべきである - 指定された人へのコールの上端を行う方法の対象である、転送シーケンス(順序)および最後に実行されます
1.オブザーバーパターン:オブジェクト指向の溶液
インタフェースの規定は、この方法があります
1つの パブリック インターフェイスIObserver 2 { 3 ボイドアクション(); 4 }
各トリガーアクションは、このインタフェースを実現するためにあります
1つの パブリック クラスベビー:IObserver 2 { 3 公共 ボイドアクション() 4 { 5 本.Cry()。 6 } 7 8 公共 ボイドクライ() 9 { 10 Console.WriteLineを(" {0}叫び"、この.GetType()の名前。); 11 } 12 }
1つの パブリック クラスブラザー:IObserver 2 { 3 公共 ボイドアクション() 4 { 5 本.Turn()。 6 } 7 公共 ボイドターン() 8 { 9 Console.WriteLineを(" {0}ターン"、この.GetType()の名前。); 10 } 11 }
1つの パブリック クラスチキン:IObserver 2 { 3 公共 ボイドアクション() 4 { 5 本.Woo()。 6 } 7 公共 ボイドウー() 8 { 9 Console.WriteLineを(" {0}ウー"、この.GetType()の名前。); 10 } 11 }
そして、その作用を達成
猫クラスの定義、上部のアクションを追加することができますAddObserverインターフェイスを追加
1 パブリック クラス猫 2 { 3 4 プライベートリスト<IObserver> _ObserverList = 新しいリスト<IObserver> (); 5 公共 ボイドAddObserver(IObserverオブザーバ) 6 { 7 この._ObserverList.Add(観察)。 8 } 9 公共 ボイドMiaoObserver() 10 { 11 Console.WriteLineを(" {0} MiaoObserver ..... "、この.GetType()の名前。); 12 もし(この ._ObserverList!= NULL ) 13 { 14 のforeach(VARの観察で_ObserverList) 15 { 16 observer.Action()。 17 } 18 } 19 } 20 }
コール
1 { 2 Console.WriteLineを(" ************************ " )。 3 猫猫= 新しいキャット(); 4 cat.AddObserver(新しい犬())。 5 cat.AddObserver(新しいマウス())。 6 cat.AddObserver(新チキン()); 7 cat.AddObserver(新しいベビー()); 8 cat.AddObserver(新しいブラザー())。 9 cat.AddObserver(新しい父()); 10 cat.AddObserver(新しい母()); 11 cat.AddObserver(新しい近隣())。 12 cat.AddObserver(新しい盗みます())。 13 cat.MiaoObserver()。 14 }
2. Observerパターン:溶液のアプリケーションイベント(マルチキャストデリゲート)
猫の定義
1 パブリック クラス猫 2 { 3 4 5 6 パブリック イベントアクションMiaoHandler。 7 公共 ボイドMiaoEvent() 8 { 9 Console.WriteLineを(" {0} MiaoEvent ..... "、この.GetType()の名前。); 10 であれば(この .MiaoHandler!= NULL ) 11 { 12 // foreachの(this.MiaoHandler.GetInvocationList()内のアクションアクション) 13 // { 14 // action.Invoke()。 15 // } 16 この.MiaoHandler.Invoke()。 17 } 18 } 19 20 21 22 }
コール
1 { 2 Console.WriteLineを(" ************************ " )。 3 猫猫= 新しいキャット(); 4 // cat.MiaoHandler + =新しいアクション(新しい犬()王。); 5 6 cat.MiaoHandler + = 新しいアクション(()=> 新しい犬()王(3 ))。 7 8 cat.MiaoHandler + = 新しいマウス()を実行します。 9 cat.MiaoHandler + = 新しいチキン()ウー。 10 cat.MiaoHandler + = 新しい赤ちゃん()クライ。 11 cat.MiaoHandler + = 新しいブラザー()にしてください。; 12 cat.MiaoHandler + = 新しい父()ロア。 13 cat.MiaoHandler + = 新しい母()ウィスパー。 14 cat.MiaoHandler + = 新しい隣人()アウェイク。 15 cat.MiaoHandler + = 新しい盗む()を隠します。 16 cat.MiaoEvent()。 17 }
Observerパターンは、私たちは数と順序にメソッド呼び出しのコンテキストでアクションの数を解決するために、そしてその上端が異なる状況に対処するように頻繁に変更される問題は、上端部にこれらの2つの方法の移転により発生します