一派阱、觀察者模式
【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)
- 觀察者和被觀察者是抽象耦合的。
- 建立一套觸發(fā)機(jī)制祭往。
【5】缺點(diǎn)
- 如果一個(gè)被觀察者對象有很多的直接和間接的觀察者的話伦意,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。
- 如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話硼补,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用驮肉,可能導(dǎo)致系統(tǒng)崩潰。
- 觀察者模式?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)
- 支持簡單的廣播通信检号,當(dāng)對象狀態(tài)發(fā)生改變時(shí),會(huì)自動(dòng)通知已經(jīng)訂閱過的對象蛙酪。
- 發(fā)布者與訂閱者耦合性降低齐苛,發(fā)布者只管發(fā)布一條消息出去,它不關(guān)心這條消息如何被訂閱者使用桂塞,同時(shí)凹蜂,訂閱者只監(jiān)聽發(fā)布者的事件名,只要發(fā)布者的事件名不變阁危,它不管發(fā)布者如何改變
- 對于第一點(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)
- 創(chuàng)建訂閱者需要消耗一定的時(shí)間和內(nèi)存颈娜。
- 雖然可以弱化對象之間的聯(lián)系,如果過度使用的話浙宜,反而使代碼不好理解及代碼不好維護(hù)等等官辽。
【5】主要解決問題
發(fā)布-訂閱模式是前端常用的一種設(shè)計(jì)模式,現(xiàn)在主流的MVVM框架粟瞬,都大量使用了此設(shè)計(jì)模式同仆,其主要作用有以下兩點(diǎn):
- 可以實(shí)現(xiàn)模塊間通信
- 可以在一定程度上實(shí)現(xiàn)異步編程
前端的事件綁定有三要素:
- 傳入事件類型
- 聲明對應(yīng)的回調(diào)方法
- 觸發(fā)條件。觸發(fā)條件為對應(yīng)的事件類型裙品。前端DOM的事件系統(tǒng)本質(zhì)也是發(fā)布訂閱模式俗批,而我們在業(yè)務(wù)處理中所應(yīng)有的模式也與此類似,只不過發(fā)布訂閱模式應(yīng)用的是自定義事件類型市怎,可以自定義岁忘。
三、兩者區(qū)別
訂閱-發(fā)布是觀察者模式的一個(gè)變種区匠。
觀察者模式中主體和觀察者是互相感知的干像,發(fā)布-訂閱模式是借助第三方來實(shí)現(xiàn)調(diào)度的,發(fā)布者和訂閱者之間互不感知
訂閱-發(fā)布驰弄,觀察者只有訂閱了才能接受到被觀察者的消息麻汰,同時(shí)觀察者還可以取消接受被觀察者的消息,也就是說在觀察者和被觀察者之間存在-個(gè)經(jīng)紀(jì)人Broker來管理觀察者和被觀察者戚篙。
從表面上看:
- 觀察者模式里五鲫,只有兩個(gè)角色一一 觀察者+被觀察者
- 而發(fā)布訂閱模式里,卻不僅僅只有發(fā)布者和訂閱者兩個(gè)角色岔擂,還有一個(gè)經(jīng)常被我們忽略的一一經(jīng)紀(jì)人Broker
往更深層次講:
- 觀察者和被觀察者位喂,是松耦合的關(guān)系
- 發(fā)布者和訂閱者,則完全不存在耦合
從使用層面上講
- 觀察者模式乱灵,多用于單個(gè)應(yīng)用內(nèi)部
- 發(fā)布訂閱模式忆某,則更多的是一種跨應(yīng)用的模式(cross-application pattern),比如消息中間件
文章每周持續(xù)更新阔蛉,可以微信搜索「 前端大集錦 」第一時(shí)間閱讀弃舒,回復(fù)【視頻】【書籍】領(lǐng)取200G視頻資料和30本PDF書籍資料