【文章】
1。オブザーバーパターンの定義:
簡単に言えば、オブザーバーパターンは1対多依存性を定義し、1つ以上のオブザーバーオブジェクトがトピックオブジェクトを聞くことができます。このようにして、観測された状態が変化する場合、対応するオブザーバーは、これらのオブザーバーオブジェクトを自動的に更新できるように通知する必要があります。例:GUIのイベント処理メカニズムは、オブザーバーモードを採用しています。
2。オブザーバーモードの実装:
件名(観察されるオブジェクトインターフェイス):ConcreTesubjectの統一インターフェイスを指定します。各被験者には複数のオブザーバーを持つことができます。 concretesubject(特定の観察されたオブジェクト):すべての特定のオブザーバーへの参照のリストを維持します。ステータスが変更されると、登録されたすべてのオブザーバーに通知が送信されます。オブザーバー(オブザーバーインターフェイス):concreteobserverの統一インターフェイスを指定します。観測されたオブジェクトの状態が変更されたときに呼び出される更新()メソッドを定義します。 concreteobserver:concretesubjectへの参照を維持します。特定の状態は、concretesubjectと同期されています。オブザーバーインターフェイス、更新()メソッドの関数を実装します:被験者の変更が検出されると、情報が更新されます。
図は次のように説明されています。
注:すべてのオブザーバーを維持するために、観測クラスにセットがあります。
3.例を挙げてください:
[スキーム1]:インターフェイスまたはクラスを自分で定義して、オブザーバーパターンを実装します。
手順は次のとおりです。
(1)オブザーバーが所有するインターフェイスを定義します。
パッケージcom.vince.observer; public interface observable {//オブザーバーのパブリックvoid registerobserverとして登録(オブザーバーオブザーバー); //オブザーバーパブリックボイドremoveObserver(オブザーバーオブザーバー)をキャンセルします。 //すべてのオブザーバーに通知して情報を更新しますpublic void notifyobservers();}(2)特定のオブザーバー:Cupを定義します
パッケージcom.vince.observer;インポートjava.util.vector;パブリッククラスカップ実装{//オブザーバーのプライベートベクトル<オブザーバー> vector = new Vector <Omberver>();プライベートフロート価格。パブリックカップ(フロート価格){this.price = price; } public float getPrice(){return price; } public void setprice(float rice){//価格を変更するときにすべてのオブザーバーに通知する。 notifyobservers(); } @Override public void RegisterObserver(Observer Observer){// Observer vector.add(Observer); } @Override public void removeObserver(Observer Observer){// Observer.Remove(Observer); } @Override public void notifyobservers(){//実装すべてのオブザーバーオブジェクト(オブザーバーオブザーバー:vector){observer.update(price); }}}(3)オブザーバーが持っている一般的なインターフェイスを定義します。(データの更新はもちろん最終結果はオブザーバーで実行されるべきです)
パッケージcom.vince.observer; public interface observer {public void update(float price); 5}(4)特定のオブザーバーオブジェクトを定義します。
パッケージcom.vince.observer; public classの人はオブザーバーを実装します{private string name;パブリックパーソン(文字列名){this.name = name; } @Override public void update(float price){system.out.println(name+"あなたがフォローしているカップの価格は次のように更新されました:"+価格); }}(5)テスト:
パッケージcom.vince.observer; public class test {public static void main(string [] args){//オブザーバーオブジェクトカップ人形=新しいカップ(3000); // 2つのオブザーバーオブジェクトを作成する人P1 =新しい人( "life 1");人P2 =新しい人( "Life 2"); //オブザーバーDoll.RegisterObServer(P1)として登録します。 Doll.registerobserver(P2); System.out.println( "プロモーションの最初のラウンド:"); Doll.SetPrice(2698); //価格変更System.out.println( "第2ラウンドプロモーション:"); Doll.SetPrice(2299); // System.out.println( "第2ラウンドプロモーション:"); Doll.SetPrice(1998); Doll.RemoveObServer(P2); // life 2 System.out.println( "第4ラウンドプロモーション:"); Doll.SetPrice(1098); }}実行後、結果は次のように表示されます。
[スキーム2]: JDK APIを直接呼び出して実装します。
手順は次のとおりです。
(1)観察可能なクラスを継承することにより、特定のオブザーバーオブジェクトを実装します。
パッケージcom.vince.observer2; Import java.util.observable; public class cup拡張{private float price;パブリックカップ(フロート価格){this.price = price; } public float getPrice(){return price; } public void setprice(float frice){this.price = fith; this.setchanged(); //通知、データはthis.notifyobservers()を変更しました。 }}(2)java.util.observerインターフェイスを実装して、特定のオブザーバーオブジェクトを実装します。
パッケージcom.vince.observer2; import java.util.observable; import java.util.observer; public classの人はオブザーバー{private string name;パブリックパーソン(文字列名){this.name = name; } @Override public void update(Observable o、object arg){if(o instanceof cup){cup cup =(cup)o; System.out.println(name+"あなたがフォローしているカップの価格は、"+cup.getprice())に更新されました。 }}}(3)テスト:
パッケージcom.vince.observer2; public class test {public static void main(string [] args){cup cup = new Cup(3000);人P1 =新しい人( "Life 1");人P2 =新しい人( "Life 2"); cup.addobserver(P1); cup.addobserver(P2); System.out.println( "プロモーションの最初のラウンド"); cup.setprice(2988); System.out.println( "第2ラウンドのプロモーション"); cup.setprice(2698); cup.deleteobserver(P2); System.out.println( "第3ラウンドのプロモーション"); cup.setprice(1998); }}実行後、結果は次のとおりです。
【プロジェクトドキュメント】
リンク:http://xiazai.vevb.com/201609/yuanma/javaseguancha(vevb.com).rar
4。概要:(オブザーバーモードの役割)
オブザーバーパターンは、オブザーバーとオブザーバーの間に抽象的な結合を作成します。すべてのオブザーバーのキャラクターは、オブザーバーの特定のリストにすぎません。
オブザーバーとオブザーバーは密接に結合されていないため、さまざまなレベルの抽象化に属することができます。オブザーバーとオブザーバーの両方が一緒に投げられた場合、オブジェクトは抽象化と具体化のレベルを超えなければなりません。
オブザーバーモードは、ブロードキャスト通信をサポートします。オブザーバーは、登録されたすべてのオブザーバーに通知を発行します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。