觀察者模式和發(fā)布-訂閱模式的區(qū)別

一派阱、觀察者模式

【1】定義

觀察者模式定義了對象間的一種一對多的依賴關(guān)系阅懦,當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí)缨睡,所有依賴于它的對象都將得到通知鸟悴,并自動(dòng)更新。觀察者模式屬于行為型模式奖年,行為型模式關(guān)注的是對象之間的通訊细诸,觀察者模式就是觀察者和被觀察者之間的通訊。觀察者模式有一個(gè)別名叫“發(fā)布-訂閱模式”陋守,或者說是“訂閱-發(fā)布模式”震贵,訂閱者和訂閱目標(biāo)是聯(lián)系在一起的,當(dāng)訂閱目標(biāo)發(fā)生改變時(shí)水评,逐個(gè)通知訂閱者猩系。

【2】案例

案例:我辦了一個(gè)補(bǔ)習(xí)班,學(xué)生想來我這學(xué)習(xí)中燥,必須先報(bào)名(訂閱)寇甸。收齊一幫學(xué)生,開始教學(xué)疗涉,學(xué)生們聽了我的課及時(shí)更新了自己的認(rèn)知拿霉。我和學(xué)生們緊密相連。每個(gè)人我都認(rèn)識(shí)博敬。我和學(xué)生就是上面文章開頭所說的 "一對多" 的依賴關(guān)系友浸。

【3】主要解決的問題

一個(gè)對象狀態(tài)改變給其他對象通知的問題,而且要考慮到易用和低耦合偏窝,保證高度的協(xié)作收恢。

【4】優(yōu)點(diǎn)

  1. 觀察者和被觀察者是抽象耦合的。
  2. 建立一套觸發(fā)機(jī)制祭往。

【5】缺點(diǎn)

  1. 如果一個(gè)被觀察者對象有很多的直接和間接的觀察者的話伦意,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。
  2. 如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話硼补,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用驮肉,可能導(dǎo)致系統(tǒng)崩潰。
  3. 觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的已骇,而僅僅只是知道觀察目標(biāo)發(fā)生了變化离钝。

二、發(fā)布-訂閱模式

【1】介紹

其實(shí)24種基本的設(shè)計(jì)模式中并沒有發(fā)布-訂閱模式褪储,上面也說了卵渴,他只是觀察者模式的一個(gè)別稱。但是經(jīng)過時(shí)間的沉淀鲤竹,似乎他已經(jīng)強(qiáng)大了起來浪读,已經(jīng)獨(dú)立于觀察者模式,成為另外一種不同的設(shè)計(jì)模式。在現(xiàn)在的發(fā)布訂閱模式中碘橘,稱為發(fā)布者的消息發(fā)送者不會(huì)將消息直接發(fā)送給訂閱者互订,這意味著發(fā)布者和訂閱者不知道彼此的存在。在發(fā)布者和訂閱者之間存在第三個(gè)組件痘拆,稱為消息代理或調(diào)度中心或中間件仰禽,它維持著發(fā)布者和訂閱者之間的聯(lián)系,過濾所有發(fā)布者傳入的消息并相應(yīng)地分發(fā)它們給訂閱者纺蛆。

【2】案例

線上課程:我在某視頻網(wǎng)站上開了一個(gè)專欄坟瓢,把我的課上傳上去,喜歡的同學(xué)訂閱我的專欄犹撒。后續(xù)我只要把最新課程傳到視頻站上就好了折联,學(xué)生們聽了我的課亦能及時(shí)新了自己的認(rèn)知。我和學(xué)生們的聯(lián)系不是那么大了识颊。我也不需要認(rèn)識(shí)他們诚镰。

后者比前者多了一個(gè)類似中轉(zhuǎn)站的東西(調(diào)度中心),省了我好多事祥款。有學(xué)生不愿意學(xué)了 清笨,直接找調(diào)度中心退訂就好了,不用找我說刃跛。我發(fā)布的新課程也由調(diào)度中心做廣播抠艾,不用我自己再一個(gè)個(gè)通知,不會(huì)影響到我自己干其他工作桨昙。

【3】優(yōu)點(diǎn)

  1. 支持簡單的廣播通信检号,當(dāng)對象狀態(tài)發(fā)生改變時(shí),會(huì)自動(dòng)通知已經(jīng)訂閱過的對象蛙酪。
  2. 發(fā)布者與訂閱者耦合性降低齐苛,發(fā)布者只管發(fā)布一條消息出去,它不關(guān)心這條消息如何被訂閱者使用桂塞,同時(shí)凹蜂,訂閱者只監(jiān)聽發(fā)布者的事件名,只要發(fā)布者的事件名不變阁危,它不管發(fā)布者如何改變
  3. 對于第一點(diǎn)玛痊,我們?nèi)粘9ぷ髦幸步?jīng)常使用到,比如我們的ajax請求狂打,請求有成功(success)和失敗(error)的回調(diào)函數(shù)擂煞,我們可以訂閱ajax的success和error事件。我們并不關(guān)心對象在異步運(yùn)行的狀態(tài)菱父,我們只關(guān)心success的時(shí)候或者error的時(shí)候我們要做點(diǎn)我們自己的事情就可以了~

【4】缺點(diǎn)

  1. 創(chuàng)建訂閱者需要消耗一定的時(shí)間和內(nèi)存颈娜。
  2. 雖然可以弱化對象之間的聯(lián)系,如果過度使用的話浙宜,反而使代碼不好理解及代碼不好維護(hù)等等官辽。

【5】主要解決問題
發(fā)布-訂閱模式是前端常用的一種設(shè)計(jì)模式,現(xiàn)在主流的MVVM框架粟瞬,都大量使用了此設(shè)計(jì)模式同仆,其主要作用有以下兩點(diǎn):

  1. 可以實(shí)現(xiàn)模塊間通信
  2. 可以在一定程度上實(shí)現(xiàn)異步編程

前端的事件綁定有三要素:

  1. 傳入事件類型
  2. 聲明對應(yīng)的回調(diào)方法
  3. 觸發(fā)條件。觸發(fā)條件為對應(yīng)的事件類型裙品。前端DOM的事件系統(tǒng)本質(zhì)也是發(fā)布訂閱模式俗批,而我們在業(yè)務(wù)處理中所應(yīng)有的模式也與此類似,只不過發(fā)布訂閱模式應(yīng)用的是自定義事件類型市怎,可以自定義岁忘。

三、兩者區(qū)別

  1. 訂閱-發(fā)布是觀察者模式的一個(gè)變種区匠。

  2. 觀察者模式中主體和觀察者是互相感知的干像,發(fā)布-訂閱模式是借助第三方來實(shí)現(xiàn)調(diào)度的,發(fā)布者和訂閱者之間互不感知

  3. 訂閱-發(fā)布驰弄,觀察者只有訂閱了才能接受到被觀察者的消息麻汰,同時(shí)觀察者還可以取消接受被觀察者的消息,也就是說在觀察者和被觀察者之間存在-個(gè)經(jīng)紀(jì)人Broker來管理觀察者和被觀察者戚篙。

從表面上看:

  1. 觀察者模式里五鲫,只有兩個(gè)角色一一 觀察者+被觀察者
  2. 而發(fā)布訂閱模式里,卻不僅僅只有發(fā)布者和訂閱者兩個(gè)角色岔擂,還有一個(gè)經(jīng)常被我們忽略的一一經(jīng)紀(jì)人Broker

往更深層次講:

  1. 觀察者和被觀察者位喂,是松耦合的關(guān)系
  2. 發(fā)布者和訂閱者,則完全不存在耦合

從使用層面上講

  1. 觀察者模式乱灵,多用于單個(gè)應(yīng)用內(nèi)部
  2. 發(fā)布訂閱模式忆某,則更多的是一種跨應(yīng)用的模式(cross-application pattern),比如消息中間件

文章每周持續(xù)更新阔蛉,可以微信搜索「 前端大集錦 」第一時(shí)間閱讀弃舒,回復(fù)【視頻】【書籍】領(lǐng)取200G視頻資料和30本PDF書籍資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市状原,隨后出現(xiàn)的幾起案子聋呢,更是在濱河造成了極大的恐慌,老刑警劉巖颠区,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削锰,死亡現(xiàn)場離奇詭異,居然都是意外死亡毕莱,警方通過查閱死者的電腦和手機(jī)器贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門颅夺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛹稍,你說我怎么就攤上這事吧黄。” “怎么了唆姐?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵拗慨,是天一觀的道長。 經(jīng)常有香客問我奉芦,道長赵抢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任声功,我火速辦了婚禮烦却,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘先巴。我一直安慰自己短绸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布筹裕。 她就那樣靜靜地躺著醋闭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朝卒。 梳的紋絲不亂的頭發(fā)上证逻,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機(jī)與錄音抗斤,去河邊找鬼囚企。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瑞眼,可吹牛的內(nèi)容都是我干的龙宏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼伤疙,長吁一口氣:“原來是場噩夢啊……” “哼银酗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徒像,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黍特,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锯蛀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灭衷,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年旁涤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翔曲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迫像。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞳遍,靈堂內(nèi)的尸體忽然破棺而出闻妓,到底是詐尸還是另有隱情,我是刑警寧澤傅蹂,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站算凿,受9級特大地震影響份蝴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氓轰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一婚夫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧署鸡,春花似錦案糙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炉抒,卻和暖如春奢讨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焰薄。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工拿诸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塞茅。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓亩码,卻偏偏與公主長得像,于是被迫代替她去往敵國和親野瘦。 傳聞我的和親對象是個(gè)殘疾皇子描沟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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