設計模式之——觀察者模式

前言:
本文僅作為第一次學習設計模式的參考和筆記。
初探觀察者模式:

觀察者模式:Observer Pattern


又名:發(fā)布訂閱模式。

原話:Define a one-to-many dependency between objects so that when one object changes state ,all its dependents are notified and updated automatically.
直譯:定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新。(因為你變了,所以我們也變了)

1. 定義:被觀察者(一個對象)改變某種狀態(tài),所有觀察者(多個對象)會做出相應的反應。
2. 示例類圖:
觀察者模式通用類圖
  • Subject:被觀察者
  • Observer觀察者
  • ConcreteSubject具體的被觀察者
  • ConcreteObserver具體的觀察者
3. 示例代碼:
//被觀察者:Subject
abstract class Subject{
    //定義一個觀察者數(shù)組
    private Vector<Observer> ObsVector =  new Vector<Observer>();
    //增加一個觀察者
    public void addObserver(Observer o){
        this.ObsVector.add(o);
    }
    //刪除一個觀察者
    public void delObserver(Observer o){
        this.ObsVector.remove(o);
    }
    //通知所有觀察者
    public void notifyObservers(){
        for(Observer o:this.ObsVector){
            o.update();
        }
    }
}

//具體的被觀察者:ConcreteSubject
class ConcreteSubject extends Subject{
    //具體的業(yè)務
    public void doSomeThing(){
        
        /*
         *   do something here!
         */
        
        //最后 通知所有觀察者
        super.notifyObservers();
    }
}

//觀察者接口:Observer
instance Observer{
    //更新方法
    public void update();
}

//具體的觀察者:ConcreteObserver
class ConcreteObserver implements Observer{
    //實現(xiàn)更新方法
    public void update(){
        
        //becasuse of Subject ,ConcreteObserver do something here, and response!
        
    }
}

public class Client{
    public static void main(String[] args){
        //1.創(chuàng)建一個被觀察者
        ConcreteSubject subject = new ConcreteSubject();
        //2.定義一個觀察者
        Observer obs = new ConcreteSubject();
        //3.觀察者觀察被觀察者
        subject.addObserver(obs);
        //4.被觀察者行動,所有觀察者連鎖行動
        subject.doSomeThing();
    }
}
4. 優(yōu)點:
  • 觀察者和被觀察者之間 低耦合
  • 可建立一套完美的連續(xù)觸發(fā)機制
5. 缺點:
  • 復雜的調用,降低開發(fā)效率,以及運行效率
  • 一個觀察者卡住,整體會卡?。ǘ嗖捎枚嗑€程異步處理)
6. 使用場景:
  • 關聯(lián)行為場景
  • 事件多級觸發(fā)場景
  • 跨系統(tǒng)的消息交換場景
7. 注意事項:
  • 廣播鏈問題:
    一個對象可以有雙重身份,既是觀察者,又是被觀察者。邏輯復雜,可維護性降低。一個項目最好最多只出現(xiàn)一個對象既是觀察者又是被觀察者,這比較好控制。
  • 異步處理問題:
    如果觀察者比較多,處理時間較長,使用多線程異步處理,多線程異步就要考慮到 “線程的安全” 和 “隊列”的問題。
8. 擴展:JAVA的JDK中,提供了java.util.Observable實現(xiàn)類和java.util.Observer接口??梢灾苯永^承使用,更加簡單方便。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 前言定義:觀察者設計模式定義了對象間的一種一對多的依賴關系,以便一個對象的狀態(tài)發(fā)生變化時,所有依賴于它的對象都得到...
    xsp單細胞閱讀 488評論 0 1
  • 前言: 之前項目有個模塊需要實現(xiàn)被通知的作用,那是第一時間就想到了觀察者,那個模塊是對象間一對一的依賴關系,...
    felicia_coder閱讀 473評論 0 2
  • 觀察者模式 Rxjava中運用到了觀察者模式,那什么是觀察者模式呢,現(xiàn)在來學習一下。正所謂觀察,就是看,細察事物的...
    cgzysan閱讀 621評論 0 4
  • 當年醉花蔭下 紅顏剎那 菱花淚朱砂 猶記歌里繁華 夢里煙花 憑誰錯牽掛 黃鶴樓空蕭條 羈旅天涯 青絲成白發(fā) 流年偷...
  • 半夜,被震天的鑼鼓嚇醒 門縫塞進一份報紙來 上說 無量大道前幾日吊死了個人的那棵杉樹上夾著半只狗 附有一張照片 狗...
    scumalapert閱讀 819評論 4 2

友情鏈接更多精彩內(nèi)容