設(shè)計模式之觀察者模式

觀察者模式(常用設(shè)計模式)

觀察者模式谬俄,是類的行為模式蝇更,又叫做發(fā)布訂閱模式,模型視圖模式,源監(jiān)聽器模式翁都。

動機

將一個系統(tǒng)分割成一系列相互協(xié)作的類有一個很不好的副作用,那就是需要維護相關(guān)對象的一致性罐寨。
我們不希望為了維護一致性而使各類緊密耦合自沧,這樣會給維護、擴展和重用都帶來不便明刷。
而觀察者模式是主題(Subject)可以有任意數(shù)量依賴它的觀察者(Observer)婴栽,當(dāng)主題狀態(tài)發(fā)生改變時,
所有的觀察者都能收到通知辈末,而Subject并不需要知道具體的Observer是誰愚争,因為它只是依賴于Observer的抽象,

這正是依賴抽象不依賴具體的設(shè)計提現(xiàn)挤聘。

結(jié)構(gòu)圖如下:
image.png

觀察者模式所涉及的角色有:

●  抽象主題(Subject)角色:抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里轰枝,每個主題都可以有任何數(shù)量的觀察者。抽象主題提供一個接口组去,可以增加和刪除觀察者對象鞍陨,抽象主題角色又叫做抽象被觀察者(Observable)角色。

●  具體主題(ConcreteSubject)角色:將有關(guān)狀態(tài)存入具體觀察者對象从隆;在具體主題的內(nèi)部狀態(tài)改變時诚撵,給所有登記過的觀察者發(fā)出通知缭裆。具體主題角色又叫做具體被觀察者(Concrete Observable)角色。

●  抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口砾脑,在得到主題的通知時更新自己幼驶,這個接口叫做更新接口。

●  具體觀察者(ConcreteObserver)角色:存儲與主題的狀態(tài)自恰的狀態(tài)韧衣。具體觀察者角色實現(xiàn)抽象觀察者角色所要求的更新接口盅藻,以便使本身的狀態(tài)與主題的狀態(tài) 像協(xié)調(diào)。如果需要畅铭,具體觀察者角色可以保持一個指向具體主題對象的引用氏淑。


java提供的支持

在java語言中,提供了一個Observable類以及一個observer接口硕噩,構(gòu)成java語言對觀察者模式的支持假残。

observer接口

? Observer接口,是指觀察者類繼承的接口炉擅。指只定義了一個方法辉懒,即update()方法,當(dāng)被觀察者對象的狀態(tài)發(fā)生變化時谍失,被觀察者對象的notifyObserver()方法就會調(diào)用這一個方法眶俩。

Observable

? 該類是被觀察者類的超類,提供公開的方法支持被觀察者對象快鱼。列舉其中兩個方法比較重要:

  1. setChange() 被調(diào)用后颠印,會設(shè)置一個內(nèi)部標(biāo)記變量,代表被觀察者的狀態(tài)發(fā)生了變化抹竹。
  2. notifyObservers,這個方法被調(diào)用后线罕,會調(diào)用所有觀察者對象的update()方法。是這些觀察者對象可以更新自己窃判。

怎樣使用java提供的支持

看代碼

觀察者模式的優(yōu)缺點

優(yōu)點:

  1. 被觀察者與觀察者之間建立了抽象的松耦合钞楼。兩者之間的改變不會影響太多彼此。
  2. 觀察者模式支持廣播通信袄琳,被觀察者會向所有登記過的觀察者發(fā)出通知窿凤。

缺點:

  1. 如果一個被觀察者對象有很多直接或者間接的觀察者的話,將所有觀察者通知到會花很多時間跨蟹。

  2. 第二雳殊、如果在被觀察者之間有循環(huán)依賴的話,被觀察者會觸發(fā)它們之間進行循環(huán)調(diào)用窗轩,導(dǎo)致系統(tǒng)崩潰夯秃。在使用觀察者模式是要特別注意這一點。

    第三、如果對觀察者的通知是通過另外的線程進行異步投遞的話仓洼,系統(tǒng)必須保證投遞是以自恰的方式進行的介陶。

    第四、雖然觀察者模式可以隨時使觀察者知道所觀察的對象發(fā)生了變化色建,但是觀察者模式?jīng)]有相應(yīng)的機制使觀察者知道所觀察的對象是怎么發(fā)生變化的哺呜。

應(yīng)用場景

1、 對一個對象狀態(tài)的更新箕戳,需要其他對象同步更新某残,而且其他對象的數(shù)量動態(tài)可變。
2陵吸、 對象僅需要將自己的更新通知給其他對象而不需要知道其他對象的細節(jié)玻墅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壮虫,隨后出現(xiàn)的幾起案子澳厢,更是在濱河造成了極大的恐慌,老刑警劉巖囚似,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剩拢,死亡現(xiàn)場離奇詭異,居然都是意外死亡饶唤,警方通過查閱死者的電腦和手機徐伐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搬素,“玉大人呵晨,你說我怎么就攤上這事魏保“境撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵谓罗,是天一觀的道長粱哼。 經(jīng)常有香客問我,道長檩咱,這世上最難降的妖魔是什么揭措? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮刻蚯,結(jié)果婚禮上绊含,老公的妹妹穿的比我還像新娘。我一直安慰自己炊汹,他們只是感情好躬充,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般充甚。 火紅的嫁衣襯著肌膚如雪以政。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天伴找,我揣著相機與錄音盈蛮,去河邊找鬼。 笑死技矮,一個胖子當(dāng)著我的面吹牛抖誉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穆役,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寸五,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耿币?” 一聲冷哼從身側(cè)響起梳杏,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淹接,沒想到半個月后十性,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡塑悼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年劲适,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厢蒜。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡霞势,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斑鸦,到底是詐尸還是另有隱情愕贡,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布巷屿,位于F島的核電站固以,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘱巾。R本人自食惡果不足惜憨琳,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旬昭。 院中可真熱鬧篙螟,春花似錦、人聲如沸问拘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墅冷,卻和暖如春纯路,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寞忿。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工驰唬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腔彰。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓叫编,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霹抛。 傳聞我的和親對象是個殘疾皇子搓逾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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