この記事の内容
オブザーバーパターンは行動パターンです。
1.オブザーバーモードの概要
オブジェクト間に1対多の関係がある場合は、オブザーバーパターンが使用されます。たとえば、オブジェクトが変更されると、依存オブジェクトに自動的に通知されます。
オブザーバーは通常、次のようにサードパーティと見なすことができます。
(1)たとえば、学校での自習では、誰もがささやき、さまざまなゲームをプレイした経験があるはずです。このとき、「すぐに使える」パートナーが常に存在します。先生が現れようとしているときに先生が来ることをみんなに知らせてください。
(2)例えば、オークション中、全員が互いに入札すると、競売人は最高入札額を監視し、他の入札者に入札を通知します。これはオブザーバーモードです。
(3)オブザーバーモデルの場合、オブザーバーとオブザーバーが必要です。たとえば、ディレクトリにファイルを作成すると、システムはディレクトリマネージャにディレクトリを増やすように通知し、ディスクにスペースを減らすように通知します。ここでは、ファイルがオブザーバーであり、ディレクトリマネージャとディスクがオブザーバーです。
パブリッシュ/サブスクライブモード(パブリッシュ/サブスクライブ)とも呼ばれるオブザーバーモード(オブザーバー)は、オブジェクト間の1対多の依存関係を定義します。これにより、オブジェクトの状態が変化するたびに、それに依存するすべてのオブジェクトに通知され、自動的に更新されます。 。UML構造図は次のとおりです。
スクリーンショット
その中で、Subjectクラスはサブジェクトであり、オブザーバーオブジェクトへのすべての参照ファイルをコレクションに格納し、各サブジェクトは任意の数のオブザーバーを持つことができます。抽象サブジェクトは、オブザーバーオブジェクトを追加および削除できるインターフェイスを提供します。Observerクラスは、すべての特定のオブザーバーのインターフェイスを定義し、サブジェクトから通知されたときに自身を更新する抽象オブザーバーです。ConcreteSubjectクラスは特定のサブジェクトであり、状態に関連する特定のオブザーバーオブジェクトに格納し、特定のサブジェクトの内部状態が変更されたときにすべての登録済みオブザーバーに通知します。ConcreteObserverは特定のオブザーバーであり、抽象オブザーバーの役割に必要な更新インターフェイスを実装して、その状態が一貫するようにします。対象の州の相乗効果と。
ステップ1.抽象オブザーバーオブザーバー
オブザーバーは通常、インターフェイスであり、インターフェイスを実装するすべての実装クラスは特定のオブザーバーです。
package com.iot.practice.designpattern.observer;
/**
* <p>Observer 此接口用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月25日 14:47</p>
* <p>@remark:</p>
*/
public interface Observer {
/**
* 更新
*/
public void update();
}
ステップ2:件名
まず、オブザーバーの配列を定義し、追加、削除、および通知操作を実装します。その責任は非常に単純です。誰が監視できるか、誰が監視できないかを定義することです。Vectorの使用はスレッド同期であり、より安全です。ArrayListも使用できます。これはスレッド非同期ですが、安全ではありません。
package com.iot.practice.designpattern.observer;
import java.util.Vector;
/**
* <p>Subject 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月25日 14:45</p>
* <p>@remark:主题Subject</p>
*/
public class Subject {
/**
* 观察者数组集合
*/
private Vector<Observer> vector = new Vector<>();
/**
* 增加一个观察者
*
* @param observer 观察者
*/
public void addObserver(Observer observer) {
this.vector.add(observer);
}
/**
* 删除一个观察者
*
* @param observer 观察者
*/
public void deleteObserver(Observer observer) {
this.vector.remove(observer);
}
/**
* 通知所有观察者
*/
public void notifyObserver() {
for (Observer observer : this.vector) {
observer.update();
}
}
}
ステップ3:特定のトピック
Subjectクラスを継承し、ここで特定のサービスを実装します。特定のプロジェクトでは、このクラスの多くのバリアントがあります。
package com.iot.practice.designpattern.observer;
/**
* <p>ConcreteSubject 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月25日 14:56</p>
* <p>@remark:继承Subject类,在这里实现具体业务,在具体项目中,该类会有很多变种</p>
*/
public class ConcreteSubject extends Subject {
/**
* 具体业务逻辑
*/
public void doSomething() {
super.notifyObserver();
}
}
ステップ4:特定のオブザーバー
オブザーバーインターフェイスを実装します。
package com.iot.practice.designpattern.observer;
/**
* <p>ConcreteObserver 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月25日 14:59</p>
* <p>@remark:具体观察者,实现Observer接口。</p>
*/
public class ConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("收到通知,正在进行处理...");
}
}
ステップ5:クライアント
最初にオブザーバーを作成し、次にオブザーバーを定義し、オブザーバーをオブザーバーのオブザーバー配列に追加して、テストします。
package com.iot.practice.designpattern.observer;
/**
* <p>Client 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月25日 15:01</p>
* <p>@remark:Client客户端,首先创建一个被观察者,然后定义一个观察者,将该被观察者添加到该观察者的观察者数组中,进行测试。</p>
*/
public class Client {
public static void main(String[] args) {
// 创建一个主题
ConcreteSubject subject = new ConcreteSubject();
// 定义一个观察者
Observer observer = new ConcreteObserver();
// 将一个观察者添加到主题中
subject.addObserver(observer);
// 通知
subject.doSomething();
}
}
実行結果を次の図に示します。
第二に、オブザーバーモードの適用
目的:オブジェクト間の1対多の依存関係を定義することです。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトに通知され、自動的に更新されます。
主な解決策:オブジェクトの状態が変化したときに他のオブジェクトに通知する問題、および高度なコラボレーションを保証するには、使いやすさと低結合を考慮する必要があります。
使用する場合:オブジェクト(ターゲットオブジェクト)の状態が変化すると、すべての依存オブジェクト(オブザーバーオブジェクト)に通知され、通知がブロードキャストされます。
解決方法:オブジェクト指向テクノロジーを使用すると、この依存関係を弱めることができます。
キーコード:オブザーバーを格納するためのArrayListが抽象クラスにあります。
2.1アプリケーション例
(1)たとえば、学校での自習では、誰もがささやき、さまざまなゲームをプレイした経験があるはずです。このとき、「すぐに使える」パートナーが常に存在します。先生が現れようとしているときに先生が来ることをみんなに知らせてください。
(2)例えば、オークション中、全員が互いに入札すると、競売人は最高入札額を監視し、他の入札者に入札を通知します。これはオブザーバーモードです。
(3)オブザーバーモデルの場合、オブザーバーとオブザーバーが必要です。たとえば、ディレクトリにファイルを作成すると、システムはディレクトリマネージャにディレクトリを増やすように通知し、ディスクにスペースを減らすように通知します。ここでは、ファイルがオブザーバーであり、ディレクトリマネージャとディスクがオブザーバーです。
2.2長所と短所
利点:
(1)オブザーバーとオブザーバーは抽象的に結合されています。
(2)トリガーメカニズムを確立します。
短所:
(1)観測対象に直接および間接の観測者が多い場合、すべての観測者に通知するのに時間がかかります。
(2)オブザーバーとオブザベーションターゲットの間に循環依存関係がある場合、オブザーバーターゲットはそれらの間で循環呼び出しをトリガーし、システムがクラッシュする可能性があります。
(3)オブザーバーモードには、観察対象がどのように変化したかを観察者に知らせるための対応するメカニズムはなく、観察対象が変化したことだけを知っています。
2.3使用シナリオ
(1)抽象モデルには2つの側面があり、一方は他方に依存します。これらの側面を独立したオブジェクトにカプセル化することで、それらを独立して変更および再利用できます。
(2)1つのオブジェクトを変更すると、変更するオブジェクトの数がわからなくても、1つ以上の他のオブジェクトも変更されるため、オブジェクト間の結合度が低下する可能性があります。
(3)オブジェクトは、これらのオブジェクトが誰であるかを知らなくても、他のオブジェクトに通知する必要があります。
(4)システム内にトリガーチェーンを作成する必要があります。Aオブジェクトの動作はBオブジェクトに影響し、Bオブジェクトの動作はCオブジェクトに影響します...オブザーバーモードを使用して、チェーントリガーメカニズム。
2.4注意が必要な事項
(1)JAVAにはすでにオブザーバーパターンのサポートクラスがあります。
(2)循環参照は避けてください。
(3)順次実行すると、オブザーバーエラーによりシステムがジャムするため、非同期モードが一般的に採用されています。
3、ソースコード分析
終わり!