JAVAでオブザーバーパターンを実装する方法

WBOY
リリース: 2023-04-18 09:15:27
転載
1925 人が閲覧しました

コンセプト

オブザーバー パターンは パブリッシュ/サブスクライブ パターン とも呼ばれ、オブジェクト間の 1 対多 の関係です。オブジェクトが変更されると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。

構成

抽象テーマの役割 (件名 #)

抽象ターゲット クラスとも呼ばれる、抽象サブジェクトは、どのオブザーバーが存在するかを認識しており、オブザーバーを削除および追加する

メソッドと、オブザーバーに通知する抽象メソッド を提供します。これらは、抽象クラスまたは抽象クラスによって決定されます。インターフェイスの実装

抽象オブザーバー ロール (Observer)

更新された抽象メソッドが含まれます。抽象クラスまたはインターフェイスによって実装された、特定のサブジェクトから更新通知を受信したときに呼び出されます。

具体的なサブジェクトの役割 (具体的なサブジェクト)

特定のターゲット クラスとも呼ばれ、抽象ターゲット クラスの通知メソッドを実装します。

特定のトピックが変更されると、それ自体をサブスクライブするすべてのオブザーバーに通知します

特定のオブザーバー ロール (具体的なオブザーバー)

抽象オブザーバー ロールを実装するための抽象メソッド。

トピックを受信した後に自身のステータスを変更します。変更通知

JAVAでオブザーバーパターンを実装する方法

実装

抽象オブザーバーオブザーバーインターフェース

通知を受信し、自身のステータスを変更するためのオブザーバー メソッドが含まれています

public interface Observer {
	//收到通知,改变自身状态
    void update();
}
ログイン後にコピー

特定のオブザーバーObserverOne および ObserverTwo

Observer インターフェイスに update メソッドを実装します

public class ObserverOne implements Observer{
    @Override
    public void update() {
        System.out.println("第一个观察者收到通知,状态更新了");
    }
}
ログイン後にコピー
public class ObserverTwo implements Observer {
    @Override
    public void update() {
        System.out.println("第二个观察者收到通知,状态更新了");
    }
}
ログイン後にコピー

SubjectInterface

追加、削除するメソッドが含まれています、そしてオブザーバーに通知します。それは抽象ターゲット クラスによって実装されており、特定のターゲット クラスによって実装される独自の操作のメソッドもあります

#

public interface Subject {
    //添加观察者
    void add(Observer observer);
    //删除观察者
    void remove(Observer observer);
    //通知所有观察者
    void notifyObservers();
    //自身操作
    void operation();
}
ログイン後にコピー

#抽象ターゲット クラス

AbstractSubjectAbstract クラス。オブザーバーの数は固定されていないため、

Vector 動的配列

を使用してオブザーバーを保存し、Subject インターフェイスに add、remove、notifyObservers メソッドを実装します。 . 操作メソッドは特定のターゲット クラスによって実装されます

public abstract class AbstractSubject implements Subject{
    Vector<Observer> vector = new Vector<Observer>();
    @Override
    public void add(Observer observer){
        vector.add(observer);
    }
    @Override
    public void remove(Observer observer){
        vector.remove(observer);
    }
    @Override
    public void notifyObservers(){
        for (Observer observer : vector) {
            observer.update();
        }
    }
}
ログイン後にコピー

特定のターゲット クラス

MySubjectAbstractSubject クラスを継承します、操作メソッドを実装し、操作メソッド内で

notifyObservers メソッド

を呼び出して、自身の状態が変化した後にオブザーバーに通知する効果を実現します

public class MySubject extends AbstractSubject{
    @Override
    public void operation() {
        System.out.println("具体目标状态改变");
        System.out.println("正在通知观察者。。。");
        notifyObservers();
        System.out.println("通知完毕!");
    }
}
ログイン後にコピー

テスト クラス

Test

public class Test {
    public static void main(String[] args) {
        MySubject mySubject = new MySubject();
        mySubject.add(new ObserverOne());
        mySubject.add(new ObserverTwo());
        mySubject.operation();
    }
}
ログイン後にコピー

JAVAでオブザーバーパターンを実装する方法概要

オブザーバー パターンは主にどのような問題を解決しますか

アンダー ロー結合条件、オブジェクトの状態が変化すると、他のオブジェクトが通知を受け取る

オブザーバー パターンを使用する場合

オブジェクトの状態が変化すると、すべてが依存しますオブジェクトはブロードキャスト通知を受信します

#オブザーバー パターンの利点

オブザーバーとターゲットは抽象的に結合されており、低結合であり、一連のトリガー メカニズムを備えています

オブザーバパターンのデメリット

①対象に依存する直接オブザーバや間接オブザーバが多数ある場合、全員に通知するのに時間がかかるオブザーバー
  • ②ターゲットに直接オブザーバーと間接オブザーバーが多数ある場合循環依存関係がある場合、循環呼び出しが発生してシステムがクラッシュする可能性があります
  • ##③オブザーバーは、ターゲットの状態がどのように変化するかを知ることはできません。ターゲットの状態が変化したことだけを知ることができます。

  • オブザーバー パターンに関する注意事項

①JAVA にはオブザーバー パターンのサポート クラスがすでに存在しており、直接使用できます

  • #②循環呼び出しを避ける

  • ##③オブザーバーの update メソッドを逐次実行すると、オブザーバーのエラーによりシステムが停止してしまうため、一般的には非同期方式が使用されます。

以上がJAVAでオブザーバーパターンを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート