デザインパターン-18オブザーバ・モード(Observerパターン)

1.動機モード

オブジェクトの変更は、対応する他のオブジェクトが反応するときに、オブジェクトとオブジェクト間の依存関係を確立することは、自動的に他のオブジェクトに通知します。ここで、変更されたオブジェクトは、観察対象と呼ばれ、オブジェクトは、視聴者が通知されると、観察対象は、複数の観察者に対応することができると呼ばれ、それらと視聴者との間の接続がない、必要と削除ビューアとして増加することができます拡大するシステムが容易になり、これはオブザーバーパターンモードの動機です。

2.スキーマ定義

オブザーバーパターン(Observerパターン):関連しているオブジェクトの状態が変化し、依存するオブジェクトに通知し、自動的に更新されるたびにするようオブジェクトを定義する多くの間の依存関係の一種。また、公開として知られているオブザーバーパターン - サブスクライブ(パブリッシュ/サブスクライブ)モデル、モデル - ビュー(モデル/ビュー)モード、ソース - リスナー(ソース/リスナー)モードまたは部下(扶養)モード。

属するオブジェクトの行動パターン

3.構造モード

オブザーバーパターンを実装するオブジェクト指向設計の原則に違反して、それらの間の密結合を維持する特定のターゲットオーディエンスと特定のオブザーバーオブジェクト間で直接呼び出すことができないときに注意を払う必要があります。

次のようにオブザーバ・モードの主な役割は以下のとおりです。

  • 抽象トピック(主題)の役割:また、抽象オブジェクトクラスとして知られている、すべてのオブザーバのビューアオブジェクト、削除オブザーバオブジェクト・メソッド、抽象メソッドおよび通知を保持するための集約と増加クラスを提供します。
  • 特定のトピック(コンクリート件名)役割:また、その実装通知方法の抽象的な目標を、内部状態の特定のテーマの変更、登録済みのすべてのオブザーバーオブジェクトに通知し、特定のターゲットクラスとして知られています。
  • 抽象観測者(オブザーバー)役割:それは受け取る変更通知、特定のテーマが呼び出され、更新彼の抽象メソッドが含まれ、抽象クラスまたはインタフェースです。
  • 特定の観測者(コンクリートオブザーバー)の役割:変更通知の目標を取得するときに自分のステータスを更新するために実装される抽象オブザーバーで定義された抽象メソッド。

4.モードのコード

# 抽象观察者
public interface Observer {
    // 观察者的反应
    void response();
}

# 具体观察者
public class ConcreteObserver1 implements Observer {
    @Override
    public void response() {
        System.out.println("具体观察者 1 作出反应");
    }
}
public class ConcreteObserver2 implements Observer {
    @Override
    public void response() {
        System.out.println("具体观察者 2 作出反应");
    }
}

# 抽象主题
public abstract class Subject {
    protected List<Observer> observerList = new ArrayList<>();

    /**
     * 新增观察者
     */
    public void add(Observer observer) {
        observerList.add(observer);
    }

    public void remove(Observer observer) {
        observerList.remove(observer);
    }

    /**
     * 通知观察者
     */
    public abstract void notifyObserver();
}

# 具体主题
public class ConcreteSubject extends Subject {
    @Override
    public void notifyObserver() {
        System.out.println("具体目标发生变化...");
        for (Observer observer : observerList) {
            observer.response();
        }
    }
}

# Client
public class Client {
    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver1();
        Observer observer2 = new ConcreteObserver2();

        subject.add(observer1);
        subject.add(observer2);
        subject.notifyObserver();

        subject.remove(observer1);
        subject.notifyObserver();
    }
}

このパターンはかなり一般的であることがわかります、ソースコードの一部を見てください。もちろん、視聴者は、いくつかのパラメータを渡すことによって何かを行うことができます。

5.まとめ

分析

  • Observerパターンは、この需要を満たすために構築する方法、オブジェクトとオブジェクト間のシステムの依存関係を確立する方法について説明します。
  • このモードキー観察対象とオブジェクトがビューアにあるターゲット状態が変更されると、ターゲットは、すべてのオブザーバが通知され、観測者に依存それの任意の番号を持つことができます。
  • この通知を受けて、各観察者は即座に、自分のステータスを更新するターゲットの状態と同期させるために、この相互作用はまた、出版社と呼ばれる - (publishsubscribe)をサブスクライブします。目標は、予告そのオブザーバーは、視聴者購読および通知を受け取るの数に制限はありません誰が知っている必要はありませんを発行した際、発行者に通知することです。

利点

  • 観察分離モードは、観察者の役割の特定の表現として異なる層の種々存在することができるように、論理層とデータ層を表し、そして安定した伝達機構メッセージの更新、更新インタフェースの抽象化を定義してもよいです。
  • 観察対象と観察者との間に結合された抽象モデルビューアを確立。
  • オブザーバーモードのサポートは、通信を放送します。
  • オブザーバーモードでは、「開口部との原則を閉じる」の要件を満たしています。

短所

  • 観察対象のオブジェクトは、多くの直接的および間接的観測を持っている場合、それはすべてのオブザーバーは、多くの時間を費やす必要が通知されます。
  • 観測者と観測されたターゲットとの間に循環依存がある場合は、それらの間の循環への呼び出しをトリガーする対象を観察し、クラッシュにシステムを引き起こす可能性があります。
  • オブザーバーパターンが観察されたターゲットオブジェクトが変更が起こるかであることを、視聴者のノウハウを聞かせて、ちょうどターゲットが変更された観察することを知るためのメカニズムではありません。

おすすめ

転載: www.cnblogs.com/wuqinglong/p/12564514.html