Javaデザインパターンのオブザーバーパターン(16)

Javaデザインパターンのオブザーバーパターン①②

20歳を過ぎたら、他の人と議論するべきではありません。人々は自分の考えについて非常に頑固です。他の人を説得しようとしないでください。

デザインパターンの学習、近い将来23のデザインパターンについてブログを書きますので、お楽しみに〜
—1 / 21/2021

定義

オブザーバーモード(モデルビューモード、ソースリスナーモード、またはスレーブモードと呼ばれることもあります)は、ソフトウェア設計モードの1つです。このモードでは、ターゲットオブジェクトは、それに依存するすべてのオブザーバーオブジェクトを管理し、自身の状態が変化したときにアクティブに通知を送信します。これは通常、各オブザーバーによって提供されるメソッドを呼び出すことによって実現されます。このモードは通常、イベント処理システムを実装するために使用されます。

Baidu百科事典

プロジェクトのニーズ分析

今、牛乳やレッドブルを飲みたいとしたら、店に行って購入する必要があります

ここで、ストアは「監視対象」であり、購入した商品は「監視対象」です。

ストアでは、購入するか、十分に購入しないかを選択し、最終確認後に選択した商品を出力することができます。

最終的にいくつのアイテムが選択されても、それらはすべて同じスーパーマーケットで「チェックアウト」(出力)されます。

同じことがコードにも当てはまります。複数のオブザーバーをサブスクライブできますが、オブザーバーは1人しか存在できません。

この例では、さまざまな商品を選択できますが、このストアでチェックアウトする必要があります。

コードは人生から来る

役割分析

UML类图分析(1.1)
ここに画像の説明を挿入

  • サブジェクト:抽象サブジェクト(監視対象:抽象サブジェクトは、オブザーバーオブジェクトを追加および削除するためのインターフェイスを提供します。
  • SubjectImpl:抽象トピック実現(観察された実現):関連する状態を特定のオブザーバーオブジェクトに保存します。特定のトピックの内部状態が変化した場合は、登録されているすべてのオブザーバーに通知します。
  • オブザーバー:抽象オブザーバー:すべての具体的なオブザーバーのインターフェースを定義し、サブジェクトから通知されたときに自身を更新します。
  • MilkObserverImpl / RedBullObserver:抽象オブザーバーの実装:抽象オブザーバーの役割に必要な更新インターフェイスを実装します

コード

ここでの件名は、ストア(製品の追加/削除/エクスポートに使用)を指します。

public interface Subject {
    
    

    /**
     *    移除观察者
     */
    public void removeObserver(Observer observer);


    /**
     *    注册观察者
     */
    public void registerObserver(Observer observer);

    /**
     *   刷新观察者
     */
    public void notfiyObservers();
}

オブザーバー(特定の製品仕様):

public interface Observer {
    
    
    public void update();
}

MilkObserverImpl牛乳商品の実現:

public class MilkObserverImpl implements Observer{
    
    

    String food;
    public MilkObserverImpl(String food) {
    
    
        this.food = food;
    }
    @Override
    public void update() {
    
    
        Log.i("观察者模式","饮料为:  "+food);
    }
}

RedBullObserverImpl Red Bull商品の実装:

public class RedBullObserverImpl implements Observer{
    
    

    String food;

    public RedBullObserverImpl(String food) {
    
    
        this.food = food;
    }

    @Override
    public void update() {
    
    
        Log.i("观察者模式","饮料为:  "+food);
    }
}

SubjectImplは、最終製品を追加/削除/エクスポートします。

public class SubjectImpl implements Subject{
    
    
    List<Observer> list = new ArrayList<>();

    @Override
    public void removeObserver(Observer observer) {
    
    
        //判断是否有当前状态
        if (list.contains(observer)) {
    
    
            list.remove(observer);
        }
    }

    @Override
    public void registerObserver(Observer observer) {
    
    
        list.add(observer);
    }

    @Override
    public void notfiyObservers() {
    
    
        for (int i = 0; i < list.size(); i++) {
    
    
            list.get(i).update();
        }
    }
}

テストコード(クライアント):

//观察者
        SubjectImpl subject = new SubjectImpl();

        //被观察者
        MilkObserverImpl milkObserver = new MilkObserverImpl("牛奶");
        RedBullObserverImpl redBullObserver = new RedBullObserverImpl("红牛");

        //注册牛奶观察者
        subject.registerObserver(milkObserver);

        //注册红牛观察者
        subject.registerObserver(redBullObserver);

        //刷新 (输出结果)
        subject.notfiyObservers();

Log图(2.1)
ここに画像の説明を挿入

製品コードを削除します。

 //观察者
        SubjectImpl subject = new SubjectImpl();

        //被观察者
        MilkObserverImpl milkObserver = new MilkObserverImpl("牛奶");
        RedBullObserverImpl redBullObserver = new RedBullObserverImpl("红牛");

        //注册牛奶观察者
        subject.registerObserver(milkObserver);

        //注册红牛观察者
        subject.registerObserver(redBullObserver);


        //刷新 (输出结果)
        subject.notfiyObservers();
        Log.i("观察者模式"," ======= 移除商品,重新输出 ============");
        //移除红牛观察者
        subject.removeObserver(redBullObserver);


        //刷新 (输出结果)
        subject.notfiyObservers();

Log图(2.2)
ここに画像の説明を挿入

製品を拡張する方法

CocaColaObserverImpl新しく拡張されたCoca-Cola製品:

public class CocaColaObserverImpl implements Observer{
    
    

    String food;

    public CocaColaObserverImpl(String food) {
    
    
        this.food = food;
    }

    @Override
    public void update() {
    
    
        Log.i("观察者模式","饮料为:  "+food);
    }
}

テストコード:

		....
        CocaColaObserverImpl colaObserver = new CocaColaObserverImpl("可口可乐");
		.....

        Log.i("观察者模式"," ======= 新商品,重新输出 ============");
        subject.registerObserver(colaObserver);

        subject.notfiyObservers();

Log图(2.3)
ここに画像の説明を挿入

完全なコード

デザインパターン/デザイン原則のホームページに移動します

オリジナリティは簡単ではありません、あなたの好きなものは私にとってあなたの最大のサポートです〜

おすすめ

転載: blog.csdn.net/weixin_44819566/article/details/112938408