設計モードを1回歩く---観察者モード


1
赤信号が通り過ぎて、人が止まる.青信号が通り過ぎて、車が止まります.毎日道を歩いていると、信号が私たちがいつ道を渡ることができるか、いつ道を渡ることができないかを指揮しているのがあちこちに見えます.人も車も、常に信号の状態に注目しています.信号の状態が変わると、私たちはいつも最初に発見し、対応する応答をすることができます.正直に言うと、信号は本当に偉大な発明です.
観察者パターンといえば、観察者と被観察者の関係にほかならない.上の信号の例では、信号は観察者のようなもので、私たちは観察目標とも呼ばれていますが、歩行者や車を運転している人は観察者のように、信号の変化を常に観察しています.信号が変化すると、すぐに観察者に知らせ、観察者もよく反応します.
次に、観察者モードの定義について説明します.
オブザーバモードは、オブジェクト間の1対の多依存関係を定義し、オブジェクトの状態が変化するたびに、その依存オブジェクトが通知され、自動的に更新されるようにします.
オブザーバ・モードの別名には、Publish/Subscribeモード、モデル・ビュー・モード、ソース・リスナー・モード、またはDependentsモードがあります.
上記の例では、信号は1に相当し、路上の人は多く、信号というターゲットオブジェクトの状態が変化するたびに、多くの観察者(人)に知られる.観察者は一般的にオブジェクトの応答をします
観察者モードは行動型モードに属する
2
観察者パターンが主に解決する問題:一方の状態が変化し,その一方に依存する観察者は直ちに通知を受け取ることができる.
例えば、私たちが普段購読している微信の公衆番号は、公衆番号に新しい文章が発表されると、購読者はすぐに新しい文章のプッシュを受け取ることができます.
ここで注意しなければならないのは、対象オブジェクトが観察者の具体的な身分にかかわらず、状態の変化をすべての観察者に通知することである.知らせてくれた人が誰なのか、自分でも分からない.
3
オブザーバモードには、一般的に次の4つのロールが含まれます.
  • Subject:ターゲットオブジェクト、一般的に抽象クラス
  • に設計
  • ConcreteSubject:特定のターゲットオブジェクト、Subjectのサブクラス.
  • Observer:一般的にインタフェース
  • として設計されている観察者
  • ConcreteObserver:具体的な観察者、Observerの実現者
  • 構造図:
    次の4つの役割を具体的に説明します.
    Subject(ターゲット):ターゲットはテーマとも呼ばれ、観察対象、すなわち観察者を指す.一般的に、オブジェクトを管理するためにターゲットにオブジェクトの集合を定義します.1つの観察目標は、attach()法およびdetach()法のような観察者オブジェクトを増加および削除するための一連の方法を提供する任意の数の観察者を受け入れることができる.通知メソッドnotify()も定義されます.ターゲットクラスはインタフェースであってもよいし、抽象クラスであってもよいし、具体的なクラスであってもよいが、一般的には抽象クラスとして設計されている.
    ConcreteSubject(特定のターゲット):特定のターゲットはターゲットクラスのサブクラス(インタフェースの実装者)であり、通常は常に変化するデータが含まれており、その状態が変化した場合、その各観察者に通知する.ターゲットクラスで定義された抽象的なビジネスロジックメソッドも実現します.
    Observer(オブザーバー):オブザーバーキャラクタは一般的にインタフェースであり、ターゲットオブジェクトの状態が変化すると呼び出されるupdateメソッドがあります.
    ConcreteObserver(特定のオブザーバー):オブザーバインタフェースの実装者.このロールでは、ターゲットオブジェクトの状態が変化したときに処理する論理が定義されます.
    オブザーバモードの一般的なコード実装:
    1.ターゲットオブジェクトと特定のターゲットオブジェクトコードの例
    public abstract class Subject {  
        //                      
    protected List observers = new ArrayList();  
    
        //    ,                  
        public void attach(Observer observer) {  
        observers.add(observer);  
    }  
    
        //    ,                  
        public void detach(Observer observer) {  
        observers.remove(observer);  
    }  
    
        //          
        public abstract void notify();  
        
        //    
    }  
    
    
    //     ConcreteSubject         Subject       
    //         :
    
    class ConcreteSubject extends Subject {  
    
        //        
        public void notify() {  
        System.out.println("           ")
        //       ,               
            for(Observer obs:observers) {  
                obs.update();  
            }  
        }     
    }
    

    2.観察者と具体的な観察者コードの例
    interface Observer {  
        //        
        public void update();  
    }  
    
    //      ConcreteObserver    update()  
    //         :
    class ConcreteObserver implements Observer {  
        //        
        public void update() {  
            System.out.println("       ,        ")  
        }  
    }
    

    3.テストコード
    public class Test{
        public static void main(String[] args){
            Subject sub = new ConcreteSubject();
            sub.attach(new ConcreteObserver());
            //           notify()  
            sub.notify();
        }
    }
    

    4.印刷結果

    4
    メリット:
    1、例から観察者と被観察者は抽象的に結合しており、わずかな関連関係しかないことがわかる
    2、一連のトリガメカニズムを確立する.ターゲットオブジェクトが変化すると、ブロードキャスト通知がトリガーされ、観察者が通知を受け取ると、対応する応答もトリガーされます.
    欠点:
    1.被観察者オブジェクトに直接的かつ間接的な観察者が多数存在する場合、すべての観察者に多くの時間がかかることを通知する.
    2、観察者と観察目標との間に循環依存がある場合、観察目標はそれらの間で循環呼び出しをトリガし、システムがクラッシュする可能性がある.
    3、観察者モードは観察者に観察した目標対象がどのように変化したのかを知らせるメカニズムがなく、観察目標が変化したことを知っているだけである.
    シーンを使用:
    1.1つの抽象モデルには2つの側面があり、1つの側面は別の側面に依存する.これらの態様は、独立したオブジェクトにカプセル化され、それぞれ独立して変更および多重化することができる.
    2.1つのオブジェクトの変更により、他の1つまたは複数のオブジェクトも変更され、特定のオブジェクトがどのくらい変更されるか分からないため、オブジェクト間の結合度を低下させることができる.
    3.オブジェクトが誰であるかを知らずに、他のオブジェクトに通知する必要があります.
    4.システムにトリガチェーンを作成する必要があります.Aオブジェクトの動作はBオブジェクトに影響し、Bオブジェクトの動作はCオブジェクトに影響します.観察者モードを使用してチェーントリガメカニズムを作成できます.
    最後に
    Java言語にはObserverインタフェースも用意されており、次の簡単な説明で使用します.
    参考書:
    1.デザインモードjava版.
    2.Head First設計モード
    3.菜鳥教程サイト
    完了
    公我の衆号に注目:
    苦しい私达、更に多くのオリジナルの文章を获得して、バックグラウンドの返事
    ギフトバッグはあなたに特別なリソースのギフトバッグをあげます.