設(shè)計(jì)模式-觀察者模式

一、定義

觀察者模式(Observer Pattern)也叫做發(fā)布訂閱模式(Publish/subscribe),它是一個(gè)在項(xiàng) 目中經(jīng)常使用的模式,其定義如下:

Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定義對(duì)象間一種一對(duì)多的依賴關(guān)系战转,使得每 當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新杉辙。)

觀察者模式的通用類圖挑秉,如圖所示。

觀察者模式的通用類圖

我們先來解釋一下觀察者模式的幾個(gè)角色名稱:

  • Subject被觀察者

定義被觀察者必須實(shí)現(xiàn)的職責(zé)勋磕,它必須能夠動(dòng)態(tài)地增加妈候、取消觀察者。它一般是抽象類 或者是實(shí)現(xiàn)類挂滓,僅僅完成作為被觀察者必須實(shí)現(xiàn)的職責(zé):管理觀察者并通知觀察者苦银。

  • Observer觀察者

觀察者接收到消息后,即進(jìn)行update(更新方法)操作赶站,對(duì)接收到的信息進(jìn)行處理幔虏。

  • ConcreteSubject具體的被觀察者

定義被觀察者自己的業(yè)務(wù)邏輯,同時(shí)定義對(duì)哪些事件進(jìn)行通知贝椿。

  • ConcreteObserver具體的觀察者

每個(gè)觀察在接收到消息后的處理反應(yīng)是不同想括,各個(gè)觀察者有自己的處理邏輯。

被觀察者

public abstract class Subject { 
    //定義一個(gè)觀察者數(shù)組 
    private Vector<Observer> obsVector = new Vector<Observer>(); 
    //增加一個(gè)觀察者 
    public void addObserver(Observer o){
        this.obsVector.add(o);
    } 
    //刪除一個(gè)觀察者 
    public void delObserver(Observer o){
        this.obsVector.remove(o);
    } 
    //通知所有觀察者 
    public void notifyObservers(){ 
        for(Observer o:this.obsVector){
            o.update();
        }
    }
}

//具體被觀察者

public class ConcreteSubject extends Subject { 
    //具體的業(yè)務(wù) 
    public void doSomething(){ 
        /* 
         * do something 
         */ 
        super.notifyObservers();
    }
}

//觀察者

public interface Observer { 
    //更新方法 
    public void update();
}

//具體觀察者

public class ConcreteObserver implements Observer { 
    //實(shí)現(xiàn)更新方法 
    public void update() {
        System.out.println("接收到信息团秽,并進(jìn)行處理主胧!");
    }
}

//場(chǎng)景類 

public class Client { 
    public static void main(String[] args) { 
        //創(chuàng)建一個(gè)被觀察者 
        ConcreteSubject subject = new ConcreteSubject(); 
        //定義一個(gè)觀察者 
        Observer obs= new ConcreteObserver();
        //觀察者觀察被觀察者
        subject.addObserver(obs); 
        //觀察者開始活動(dòng)了
        subject.doSomething();
    }
}

二、應(yīng)用

2.1 優(yōu)點(diǎn)

  • 觀察者和被觀察者之間是抽象耦合

如此設(shè)計(jì)习勤,則不管是增加觀察者還是被觀察者都非常容易擴(kuò)展,而且在Java中都已經(jīng)實(shí) 現(xiàn)的抽象層級(jí)的定義焙格,在系統(tǒng)擴(kuò)展方面更是得心應(yīng)手图毕。

  • 建立一套觸發(fā)機(jī)制

根據(jù)單一職責(zé)原則,每個(gè)類的職責(zé)是單一的眷唉,那么怎么把各個(gè)單一的職責(zé)串聯(lián)成真實(shí)世 界的復(fù)雜的邏輯關(guān)系呢予颤?比如,我們?nèi)ゴ颢C冬阳,打死了一只母鹿蛤虐,母鹿有三個(gè)幼崽,因失去了 母鹿而餓死肝陪,尸體又被兩只禿鷹爭(zhēng)搶驳庭,因分配不均,禿鷹開始斗毆,然后羸弱的禿鷹死掉饲常,生存下來的禿鷹蹲堂,則因此擴(kuò)大了地盤……這就是一個(gè)觸發(fā)機(jī)制,形成了一個(gè)觸發(fā)鏈贝淤。觀察者 模式可以完美地實(shí)現(xiàn)這里的鏈條形式柒竞。

2.2 缺點(diǎn)

觀察者模式需要考慮一下開發(fā)效率和運(yùn)行效率問題,一個(gè)被觀察者播聪,多個(gè)觀察者朽基,開發(fā) 和調(diào)試就會(huì)比較復(fù)雜,而且在Java中消息的通知默認(rèn)是順序執(zhí)行离陶,一個(gè)觀察者卡殼稼虎,會(huì)影響 整體的執(zhí)行效率。在這種情況下枕磁,一般考慮采用異步的方式躲查。

多級(jí)觸發(fā)時(shí)的效率更是讓人擔(dān)憂,大家在設(shè)計(jì)時(shí)注意考慮勾效。

2.3 使用場(chǎng)景

  • 關(guān)聯(lián)行為場(chǎng)景各吨。

需要注意的是,關(guān)聯(lián)行為是可拆分的沦寂,而不是“組合”關(guān)系学密。

  • 事件多級(jí)觸發(fā)場(chǎng)景。
  • 跨系統(tǒng)的消息交換場(chǎng)景传藏,如消息隊(duì)列的處理機(jī)制腻暮。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市毯侦,隨后出現(xiàn)的幾起案子哭靖,更是在濱河造成了極大的恐慌,老刑警劉巖侈离,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试幽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡卦碾,警方通過查閱死者的電腦和手機(jī)铺坞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洲胖,“玉大人济榨,你說我怎么就攤上這事÷逃常” “怎么了擒滑?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我橘忱,道長(zhǎng)赴魁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任钝诚,我火速辦了婚禮颖御,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凝颇。我一直安慰自己潘拱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布拧略。 她就那樣靜靜地躺著芦岂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垫蛆。 梳的紋絲不亂的頭發(fā)上禽最,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音袱饭,去河邊找鬼川无。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虑乖,可吹牛的內(nèi)容都是我干的懦趋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疹味,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仅叫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糙捺,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诫咱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洪灯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂跟,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年婴渡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凯亮。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡边臼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出假消,到底是詐尸還是另有隱情柠并,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站臼予,受9級(jí)特大地震影響鸣戴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粘拾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一窄锅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缰雇,春花似錦入偷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至暇咆,卻和暖如春锋爪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爸业。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工其骄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沃呢。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓年栓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親薄霜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子某抓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本文的結(jié)構(gòu)如下: 什么是觀察者模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 推模型和拉模型 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 ...
    w1992wishes閱讀 1,441評(píng)論 0 16
  • OBSERVER(觀察者) ———— 對(duì)象行為型模式 意圖 定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生...
    tomas家的小撥浪鼓閱讀 513評(píng)論 0 1
  • 觀察者模式中通常有兩個(gè)基本的概念主題:觀察者和被觀察者惰瓜。當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí)否副,需要通知相應(yīng)的觀察者,當(dāng)然崎坊,每個(gè)...
    時(shí)待吾閱讀 1,064評(píng)論 0 2
  • 前言 Android的設(shè)計(jì)模式系列文章介紹备禀,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 30,541評(píng)論 7 64
  • 設(shè)計(jì)模式——觀察者模式 很好理解的例子 例子:李斯監(jiān)控韓非子衣食住行 一個(gè)抽象接口:被觀察者接口 一個(gè)抽象接口:抽...
    書筆年華閱讀 345評(píng)論 0 0