オブザーバーモードは、使用率が非常に高いモードで、GUIシステムやサブスクリプション発行システムで一般的に使用されています。このモデルの重要な機能はデカップリングであるため、オブザーバーとオブザーバーをデカップリングし、それらの間の依存関係をさらに小さくするか、依存関係をなくします。
定義
オブジェクト間の1対多の依存関係を定義して、各オブジェクトの状態が変化したときに、それに依存するすべてのオブジェクトに通知され、自動的に更新されるようにします。
UML图
- サブジェクト
抽象トピック、つまりObservableのロール。抽象トピックロールは、コレクション内のすべてのオブザーバーオブジェクトへの参照を格納します。各トピックは任意の数のオブザーバーを持つことができます。抽象トピックはインターフェイスを提供します。オブザーバーオブジェクトを追加および削除します。 - ConcreteSubject
特定のサブジェクト、このロールは関連する状態を特定のオブザーバーオブジェクトに保存し、特定のサブジェクトの内部状態が変化すると、登録されているすべてのオブザーバーに通知します。特定のサブジェクトロールは、具象オブザーバー(ConcreteObservable)ロールとも呼ばれます。 - オブザーバーは
抽象オブザーバーです。このロールは抽象クラスのオブザーバーです。テーマの変更が通知されたときに自身を更新するための更新インターフェイスを定義します。 - ConcreteObserver
コンクリートオブザーバー。このロールは、サブジェクトの状態が変化したときに自身の状態を更新するために、抽象オブザーバーロールによって定義された更新インターフェイスを実装します
オブザーバーモードコードの実装(Java)
観察された要約
public abstract class Subject {
// 定义一个观察者数组
private Vector<Observer> obs = new Vector<>();
// 增加一个观察者
public void addObserver(Observer o) {
this.obs.add(o);
}
// 删除一个观察者
public void delObserver(Observer o) {
this.obs.remove(o);
}
// 通知所有观察者
public void notifyObservers() {
for (Observer o : this.obs) {
o.update();
}
}
public abstract void doSomeThing();
}
特定のオブザーバー
public class ConcreteSubject extends Subject{
@Override
public void doSomeThing() {
// TODO 被观察者 处理具体业务逻辑
System.out.println("被观察者处理业务逻辑 ,并通知观察者");
// 通知观察者
super.notifyObservers();
}
}
観察者
public interface Observer {
// 更新方法
public void update();
}
特定のオブザーバー
public class ConcreteObserver implements Observer{
@Override
public void update() {
// 观察者处理具体业务逻辑
System.out.println("观察者接到信息,并处理");
}
}
オブザーバーモード呼び出し
public class ObserverPatterns {
public static void main(String[] args) {
ConcreteSubject observed = new ConcreteSubject();
Observer observer=new ConcreteObserver();
observed.addObserver(observer);
observed.doSomeThing();
}
}
該当シーン
- 関連する行動シナリオ
- イベントマルチレベル出発シーン
- メッセージキューやイベントバス処理メカニズムなどのシステム間メッセージ交換シナリオ
総括する
オブザーバーパターンの主な機能は、オブジェクトを分離し、オブザーバーをオブザーバーから完全に分離し、オブザーバーとオブザーバブルの抽象化のみに依存することです。
利点
- ビジネスの変化に対処するために、オブザーバーとオブザーバーの間には抽象的な結合があります
- システムの柔軟性とスケーラビリティを強化します
不利益
オブザーバーモードを適用する場合は、開発効率と運用効率の問題を考慮する必要があります。プログラムには、1つのオブザーバー、複数のオブザーバー、開発とデバッグなどが含まれます。コンテンツはより複雑になり、JAVAでのメッセージの通知はによって順次実行されます。デフォルト。オブザーバーがスタックしているため、全体的な実行効率に影響します。この場合、通常は非同期方式が使用されます。