Observerパターン
オブジェクト間の多くの関係が存在する場合、オブザーバーパターン(Observerパターン)を使用します。 オブジェクトが変更された場合例えば、それは自動的にその依存オブジェクトに通知します。 オブザーバーパターンは、行動パターンに属します。
入門
意図:オブジェクトの状態が変更されたときに1対多のオブジェクト間の依存関係を定義、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。
他のオブジェクトの問題へのオブジェクト変更通知の状態を、だけでなく、アカウントに使用し、低結合の容易さを取って、コラボレーションの高度を確認します 。主に解決します。
使用するときは:オブジェクト(ターゲットオブジェクト)は状態を変更し、すべての依存オブジェクト(オブジェクトのオブザーバー)は、放送通知を通知されます。
修正方法:使用するオブジェクト指向技術を、この依存関係を弱めることができます。
キーコード:抽象クラスは、ArrayListの保存されたオブザーバーを持っています。
応用例:1、オークションは、競売は最高価格を観察してから、他の入札者の入札を通知します。2、悟空要求降伏レッドボーイ仏内側西遊記は、仏の水が古い亀の挑発の床の上にこぼし、このカメは、観察者である、彼はそのアクション仏の水やりを観察しました。
利点:1、観察者と観察されたが結合された抽象的です。図2は、トリガー機構を確立します。
短所:観測されたオブジェクトが、直接および間接的観察をたくさん持っている場合は1、それはすべてのオブザーバに通知するには、多くの時間を費やすことです。観測者と観測されたターゲットとの間の循環依存がある場合は、ターゲットを観察2は、それらの間を循環するための呼び出しをトリガーするシステムがクラッシュする可能性があります。 3、オブザーバ・モードは、視聴者が視聴者に知らせるためのメカニズムはありどのように観測された変化はありませんが、ちょうど観察対象が変化することを知っているされています。
使用シナリオ:1、複数のサブクラスの一般的な方法、および同じ論理。2、重要な、複雑な方法は、テンプレートメソッドと考えることができます。
注:1を、JAVAは、すでにオブザーバ・モードのサポートクラスがあります。2は、循環参照を避けるために。 実行の順序は、視聴者がシステムエラーが立ち往生引き起こす可能性があれば、図3に示すように、一般的に非同期モードを使用します。
実現
三つのクラス件名、オブザーバーとクライアントを使用して、オブザーバーパターン。 オブジェクトと観察者とのClientオブジェクトの対象は、オブジェクトからクライアントソリューション縛らバウンドobserverメソッドです。 私たちは、Subjectクラス、オブザーバー抽象クラスを作成し、エンティティクラス抽象Observerクラスを拡張します。
ObserverPatternDemo、件名クラスオブジェクトとエンティティを使用して、私たちのデモクラスはObserverパターンを実証します。
ステップ1
件名のカテゴリを作成します。
Subject.java
輸入はjava.util.ArrayList; 輸入java.util.Listに。 パブリッククラス件名{ プライベートリスト<オブザーバー>オブザーバー =新しいのArrayList <オブザーバー>(); プライベートint型状態。 公共のint getStateを(){ 状態を返します。 } 公共ボイドSETSTATE(int型の状態){ this.state =状態。 notifyAllObservers()。 } ます。public void {(オブザーバーオブザーバー)を添付 observers.add(オブザーバー)。 } 公共ボイドnotifyAllObservers(){ {:用(オブザーバーオブザーバーオブザーバー) observer.update()。 } } }
ステップ2
Observerクラスを作成します。
Observer.java
パブリック抽象クラスオブザーバー{ 件名件名を保護。 パブリック抽象ボイド更新(); }
ステップ3
オブザーバエンティティクラスを作成します。
BinaryObserver.java
パブリッククラスBinaryObserverはオブザーバーを{拡張します 公共BinaryObserver(件名の件名){ this.subject =件名; this.subject.attach(この); } @Override 公共ボイド更新(){ System.out.println( "バイナリ列:" Integer.toBinaryString +(subject.getState()))。 } }
OctalObserver.java
パブリッククラスOctalObserverはオブザーバーを{拡張します 公共OctalObserver(件名の件名){ this.subject =件名; this.subject.attach(この); } @Override 公共ボイド更新(){ System.out.println( "オクタル文字列:" Integer.toOctalString +(subject.getState()))。 } }
HexaObserver.java
パブリッククラスHexaObserverはオブザーバーを{拡張します 公共HexaObserver(件名件名){ this.subject =件名; this.subject.attach(この); } @Override 公共ボイド更新(){ System.out.println( "六角文字列:" Integer.toHexString +(subject.getState()).toUpperCase())。 } }
ステップ4
件名およびオブザーバエンティティオブジェクトを使用します。
ObserverPatternDemo.java
パブリッククラスObserverPatternDemo { 公共の静的な無効メイン(文字列[] args){ 件名の件名=新しいSubject(); 新しいHexaObserver(サブジェクト)。 新しいOctalObserver(サブジェクト)。 新しいBinaryObserver(サブジェクト)。 System.out.println( "最初の状態変化:15"); subject.setState(15)。 System.out.println( "第二の状態変化:10"); subject.setState(10)。 } }
ステップ5
出力を確認します。
最初の状態変化:15 六角文字列:F オクタル文字列:17 バイナリ文字列:1111 第2の状態変化:10 六角文字列: オクタル文字列:12 バイナリ文字列:1010