オブザーバーパターン - デザインパターン

開発の現実には、オブジェクトの状態を変更するオブジェクトの多くは独立していない存在は、他のオブジェクトの動作中に1つ以上の変更も発生につながっている可能性があります。オブザーバーパターン - このモードでは、デザインに対応しています。

まず、パターンや特性の定義

定義:

オブジェクトの状態が変化するが、それに依存するすべてのオブジェクトが通知され、自動的に更新されたときには、オブジェクト対多の依存関係の複数の存在を指します。モデル、モデル購読 - - このモードは、時には公開と呼ばれる表示モードを、オブジェクト行動パターンです。

利点:

  1. 両者のオブジェクトと観察者、抽象的結合の間の結合を減少させます。
  2. 私たちは、目標と観測者の間でトリガ機構を設定しています。

短所:

  1. 対象と観察者との間の依存性が完全に除去されず、また、循環参照が表示されることがあります。
  2. 多くのオブザーバーは、プログラムの効率を低下させ、多くの時間を過ごすために、会議の通知をターゲットとしています。

 

第二に、実現の構造とモード

オブザーバーパターンがデザインオブジェクトの原則に違反して、直接、特定の目的やターゲット特定の視聴者間の通話、または両者の間に結合しないように注意する必要があります実装します。

構造モード

次のようにオブザーバ・モードの主な役割は、

  1. 抽象的なテーマ(主題)役割:すべてのオブザーバーとしてだけでなく、オブザーバーを保持するための集約と増加クラスオブジェクトを提供し、ターゲット抽象クラスの抽象メソッドにより、観察者は、オブジェクトを削除しました。
  2. 特定のトピック:また、抽象メソッドの目標を達成するために、クラスの特定の目標として知られ、時に内部変更の具体的な対象は、登録済みのすべてのオブザーバーオブジェクトに通知します。
  3. 抽象オブザーバーの役割は:、抽象クラスまたはインタフェースである私は、テーマが呼び出された特定の取得時に更新され、彼の抽象メソッド、変更通知が含まれています。
  4. 特定のオブザーバーの役割:抽象オブザーバーで定義された抽象メソッドを実装します。

Structureチャート

 

コードの上記構成図、実現モードによれば、

実現モード

抽象的な目標

抽象 クラス件名
{ 
    保護された一覧<オブザーバー>オブザーバー= 新しい新しいのArrayList <オブザーバー> ();   
     // 増加ビューア方法
    公共 のボイドの追加(オブザーバーオブザーバー)
    { 
        (オブザーバー)observers.add; 
    }     
    // 削除ビューア方法
    公共 のボイドの削除(観察者の観察者)
    { 
        observers.remove(観察); 
    }    
    パブリック 抽象 ボイド notifyObserver(); //はオブザーバメソッドを通知します 
}

具体的な目標

// 特定のターゲット
クラス ConcreteSubject 拡張件名
{ 
    公共 notifyObserver()
    { 
        System.out.printlnは( "ターゲットが変更に..." ); 
        System.out.printlnは(「----------- --- " );        
       
        のための(オブジェクトOBS:オブザーバー)
        { 
            ((観察)OBS).response(); 
        } 
       
    }           
}

抽象オブザーバー

インターフェースオブザーバ
{ 
    ボイド応答(); // 反应 
}

特定の観測者1

クラス ConcreteObserver1は実装オブザーバー
{ 
    公共 ボイド応答()
    { 
        System.out.printlnは( "特異オブザーバ1反応!" ); 
    } 
}

特定のオブザーバー2

クラス ConcreteObserver2は実装オブザーバー
{ 
    公共 ボイド応答()
    { 
        System.out.printlnは( "特異的オブザーバー2を反応させます!" ); 
    } 
}

実装

パブリック クラスObserverパターン
{ 
    公共 静的 ボイドメイン(文字列[]引数)
    { 
        テーマ被写体 = 新しいConcreteSubject()。
        オブザーバーOBS1 = 新しいConcreteObserver1(); 
        オブザーバーobs2 = 新しいConcreteObserver2(); 
        subject.add(OBS1)。
        subject.add(obs2)。
        subject.notifyObserver(); 
    } 
}

次のようにプログラムの結果は以下のとおりです。

ターゲットは...変更
 -------------- 
反応するように、特定のオブザーバ1を!
特定の視聴者に対応するための2!

 

シーン三つのアプリケーション、モード

分析と応用例を通して、次のシナリオを適用し、観察モードの前で見ることができますか?

  1. 多くの関係は、オブジェクトが存在する、オブジェクトの状態の変化は、他のオブジェクトに影響を与えます。
  2. 抽象モデルは、別の態様に依存している一つの局面する2つの側面を有する場合、それらは独立して、再利用変えることができるように、これらは、2つの別個のオブジェクトにパッケージ化することができます。

 

拡張4つのモード

4.1観測可能なクラス

観察可能なターゲットクラス抽象クラスであり、それは、最も重要な3つのメソッドを含むすべてのオブザーバを通知するようにホールドオブジェクトに使用され、ベクトルベクトルがあります。

  1. 空addObserver(オブザーバー0)方法:ベクトルに新しいオブジェクトを追加するためのビューア。
  2. 空notifyObservers(オブジェクトの引数)メソッド:コールアップデートすべてのオブザーバオブジェクトベクトル。データの変更ことを通知する方法。通常、観察者の最初のベクトルの後の添加を通知します。
  3. ボイドsetChange()メソッド:ターゲットオブジェクトの変更を示す、ブーリアン内部フラグを設定するために使用されます。それがtrueの場合、notifyObservers()ビューアを通知します。

4.2オブザーバーインターフェース

オブザーバインタフェースは、視聴者が通知され、対象物におけるモニターの変更がターゲット・オブジェクトが変更された抽象ビューア、であり、ボイド更新(観測O、オブジェクト引数)方法、対応する作業を呼び出します。

 

4.3例

オブザーバーパターンの例は、粗製観測クラスとオブザーバインタフェースを使用して達成しました。

クラスとオブザーバーパターンインスタンス原油先物インタフェース観測オブザーバを使用した[実施例3]。

分析:原油価格、悲しい短辺、及びよりFangju興、石油価格が下落、Fangju興、マルチ悲しいを空にする。本実施例では、抽象目標は、(観測)クラスは、サブクラスは、ときに、直接的に、すなわち、具体的な対象クラスである粗(OilFutures)クラス、クラスが定義されているSetPriCe(フロート価格)メソッドを定義することができ、Javaで定義され粗データ呼親クラスは、すべての観察者に通知するnotifyObservers(オブジェクト引数)を変更する。本実施例では、観察者(観察者)の抽象インターフェースは、Javaで定義されている限り、サブクラスが定義されているように、すなわち、特定の観察カテゴリ別の方法でもよく、実装更新(オブジェクト引数が観測O、)(マルチパーティベースおよび宇宙ベースのブルベアを含みます)。図5の構成を図。

ターゲットカテゴリ:原油先物

class OilFutures extends Observable
{
    private float price;   
    public float getPrice()
    {
        return this.price; 
    }
    public void setPrice(float price)
    {
        super.setChanged() ;  //设置内部标志位,注明数据发生变化 
        super.notifyObservers(price);    //通知观察者价格改变了 
        this.price=price ; 
    }
}

具体观察者类:多方

//具体观察者类:多方
class Bull implements Observer
{   
    public void update(Observable o,Object arg)
    {
        Float price=((Float)arg).floatValue();
        if(price>0)
        {
            System.out.println("油价上涨"+price+"元,多方高兴了!");
        }
        else
        {
            System.out.println("油价下跌"+(-price)+"元,多方伤心了!");
        }
    }
}

具体观察者类:空方

//具体观察者类:空方
class Bear implements Observer
{   
    public void update(Observable o,Object arg)
    {
        Float price=((Float)arg).floatValue();
        if(price>0)
        {
            System.out.println("油价上涨"+price+"元,空方伤心了!");
        }
        else
        {
            System.out.println("油价下跌"+(-price)+"元,空方高兴了!");
        }
    }
}

实现方式

public static void main(String[] args)
    {
        OilFutures oil=new OilFutures();
        Observer bull=new Bull(); //多方
        Observer bear=new Bear(); //空方
        oil.addObserver(bull);
        oil.addObserver(bear);
        oil.setPrice(10);
        oil.setPrice(-8);
    }

程序运行结果如下:

油价上涨10.0元,空方伤心了!
油价上涨10.0元,多方高兴了!
油价下跌8.0元,空方高兴了!
油价下跌8.0元,多方伤心了!

 

以上就是设计模式--观察者模式的基本讲解,希望对大家有所帮助!!!

おすすめ

転載: www.cnblogs.com/guohai-stronger/p/11831248.html