読み込んでいます、してくださいクレジット:https://www.cnblogs.com/tangZH/p/11175120.html
Observerパターン
端的に言えば、それは変更が発生することがあるが、また、それはすべての対多の関係であるオブジェクトに依存変更しました。
そのようなオブジェクトA、オブジェクトB、オブジェクトCと B及びCは、Aに依存して、次にA、B及びCが変化する変化。このとき、Aは観察され、B及びCは、観察者です。
オブザーバーパターンはまた、主に観察者との間で観察されたデカップリングを可能にするために、モデルをパブリッシュ/サブスクライブとして知られています。
UMLダイアグラム:
ロール説明:
件名(抽象的なトピックは):抽象クラスのオブザーバーである、それはすべてのオブザーバを参照するコレクションに格納されています。抽象トピックはインターフェースを提供し、あなたは、オブジェクトのオブザーバを追加および削除することができます。
ConcreteSubject(特定のトピック):コンクリートはオブザーバーです。状態オブザーバの場合に特定の変更、通知が送信された各登録オブザーバを与えます。
オブザーバー(抽象オブザーバー):特定の観察者のすべてのインターフェイスを定義しますすべての特定のビューア抽象クラス:そのテーマを更新したときに通知を受けます。
ConcrereObserver(特定の観測者):実装の抽象オブザーバー。
私たちは、特定の例を見て:
学校の鐘は、教師と異なる反応の学生を鳴らしました。
1、抽象的なテーマの定義:
抽象的なテーマは、いくつかの一般的な方法、内部の特定のテーマを達成するために、すなわち必要性を定義します。
// 抽象化は、視聴者 のパブリック インターフェース観測を{ // 観察者が追加 無効addObserver(オブザーバーオブザーバー); // オブザーバ除去 ボイドdeleteObserver(オブザーバーオブザーバー); // オブザーバーに通知 空隙notifyObserver(文字列MSGを); }
2、特定のテーマ(学校の鐘)を作成します。
パブリック クラスはAlarmClockが実装観察可能{ // 保存观察者对象 一覧<オブザーバー>リスト= 新しい ArrayListを<> (); @Override 公共 ボイドaddObserver(観察者の観察者){ list.add(観察)。 } @Override 公共 ボイドdeleteObserver(観察者の観察者){ list.remove(観察)。 } / ** *通知观察者 * @paramのMSG * / @Override 公共 ボイドnotifyObserver(文字列MSG){ 用(オブザーバーオブザーバー:リスト){ observer.action(MSG)。 } } }
3、抽象的観測を作成します。
これは、リンギングの行動を聞いた後、すべての特定のオブザーバーを達成するために必要なメソッドを定義します
// 抽象視聴者 パブリック インターフェースオブザーバ{ ボイドアクション(文字列MSG); }
4.特定のオブザーバーを作成します。
パブリック クラス学生は実装オブザーバー{ 文字列名を、 公共学生(文字列名){ この .nameの= 名前。 } @Override 公共 ボイドアクション(文字列MSG){ System.out.printlnは(MSG +名+ "开始听课" )。 } } パブリック クラス教師実装オブザーバー{ @Override 公共 ボイドアクション(文字列MSG)は{ System.out.print(MSG + "老师开始讲课" )。 } }
6、達成するために:
AlarmClock =観察可能な新新はAlarmClock(); オブザーバーSTUDENT1 = 新しい新しい生徒(「子役」); オブザーバーSTUDENT2 = 新新学生(「大きなおならの子」); オブザーバー教師 = 新しい新しい先生(); // 登録するオブザーバ alarmClock.addObserver (STUDENT1); alarmClock.addObserver(STUDENT2); alarmClock.addObserver(教師); // 通知されオブザーバーはオブザーバー登録されている alarmClock.notifyObserverは( "学校の鐘が鳴っされました");
7つの結果:
ここでは、Observerパターンを実現します。
シナリオ
- あなたが変更すると、オブジェクトは他のオブジェクトが変更を通知する必要があり、それが変更される時間がある正確にどのように多くのオブジェクトを知りません。
- オブジェクトが他のオブジェクトに通知しなければならないが、それは他のオブジェクトを想定することができない場合には
- シーン間でのメッセージ交換システムは、そのようなメッセージキューとして、イベントがメカニズムバスを扱います。
利点
- オブザーバーと主題の間のデカップリング。両側ではなく、コンクリートに頼るよりも、抽象的なカップリングに頼ってみましょう。それぞれの変更は、他の側の変化に影響を与えないように。
- ときに、同じトピックに関する新しいオブザーバー既存のコードを変更することなく、拡張が容易。
短所
- 依存関係は完全にまだ抽象的なテーマ抽象的観測に頼って、解除されていません。
- オブザーバー、複数のオブザーバー、開発、デバッグすることにするなど、より複雑になるプログラムを含む、開発効率と運用効率の問題についてObserverパターンを使用して、通知メッセージでのJavaの実行のためには、一般的にあるときに、考慮すべき観察者カトンは、この場合には、通常、非同期の実装を実装の全体的な効率に影響を与えます。
- これは、余分なデータ通知を引き起こす可能性があります。
内部JDKもこの2つのクラスの観測(観測者であることが抽象的)、オブザーバー(抽象オブザーバー)を内蔵し、我々はまた、直接のソースを見て具体的には、使用することができます。
- イベントをクリックします
- ListViewのリフレッシュ
- 放送など