摘要:發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個(gè)事件觸發(fā),只知道事件觸發(fā)時(shí)候,會(huì)告訴自己。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對(duì)方的存在。在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。
概念
發(fā)布訂閱者模式,是javascript甚至大多數(shù)語(yǔ)言都有的語(yǔ)言模式,比較概念的解釋是,
訂閱者把自己想訂閱的事件注冊(cè)到調(diào)度中心,當(dāng)該事件觸發(fā)時(shí)候,發(fā)布者發(fā)布該事件到調(diào)度中心(第三方),由調(diào)度中心統(tǒng)一調(diào)度訂閱者注冊(cè)到調(diào)度中心的處理代碼。優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1.一對(duì)多。
一個(gè)發(fā)布者可以綁定多個(gè)訂閱者,當(dāng)事件觸發(fā)時(shí),由調(diào)度中心全部通知。
2.解耦。
發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個(gè)事件觸發(fā),只知道事件觸發(fā)時(shí)候,會(huì)告訴自己。發(fā)布者也不用一一通知,只要告訴調(diào)度中心,事件觸發(fā)了就好了。所以代碼松耦合。
3.程序便于擴(kuò)展。
缺點(diǎn):
實(shí)現(xiàn)方式麻煩?
用平時(shí)身邊的例子解釋,比如你被阿里邀請(qǐng)面試,面試完你問(wèn)面試官什么時(shí)候出結(jié)果,面試官告訴你結(jié)果出來(lái)時(shí)候會(huì)通知你的,這樣你就不用天天打電話問(wèn)面試結(jié)果了,等面試結(jié)果出來(lái),面試官會(huì)把面試結(jié)果統(tǒng)一發(fā)郵件給面試者,當(dāng)你收到面試結(jié)果后,進(jìn)行下一步操作,是到阿里上班,還是面試下一家。
代碼實(shí)現(xiàn)var observer = function () { var _observer = {}; let _queue = {}; // 所有事件的隊(duì)列 /** * @param 注冊(cè)的事件名稱 * @param 事件觸發(fā)時(shí)執(zhí)行的函數(shù) */ _observer.on = function (eventName, fn) { if (Object.prototype.toString.call(fn) !== "[object Function]") return; if (_queue[eventName] && _queue[eventName].length > 0) { // 如果之前注冊(cè)過(guò)eventName事件 _queue[eventName].push(fn); } else { // 之前沒(méi)有注冊(cè)過(guò)eventName事件 _queue[eventName] = [fn]; } }, /** * @param 已經(jīng)觸發(fā)的事件(發(fā)布事件) */ _observer.trigger = function (triggerEventName) { var args = Array.prototype.slice.call(arguments,1); if (!_queue[triggerEventName]) return; for (var i = 0; i < _queue[triggerEventName].length; i++) { _queue[triggerEventName][i].apply(null, args); } }, // 移除注冊(cè)事件 _observer.remove = function (removeEventName) { for(var k in _queue) { if (k === removeEventName) { delete _queue[k]; } } } // 移除所有注冊(cè)事件 _observer.removeAll = function () { _queue = {}; } return _observer; }()發(fā)布訂閱者模式與觀察者模式區(qū)別
發(fā)布訂閱者模式與觀察者模式是很相似的,之前的好多網(wǎng)站、博客上也把它們畫上等號(hào),但是我前段時(shí)間接到一個(gè)面試,問(wèn)我,發(fā)布訂閱者模式與觀察者模式有什么卻別,當(dāng)時(shí)說(shuō)一樣的,結(jié)果面試管說(shuō)其實(shí)不一樣,好吧,一臉懵逼,結(jié)束時(shí)候自己查閱了一下,確實(shí)不太一樣。
區(qū)別
在觀察者模式中,觀察者是知道Subject的,Subject一直保持對(duì)觀察者進(jìn)行記錄。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對(duì)方的存在。它們只有通過(guò)調(diào)度中心進(jìn)行通信。
在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。
觀察者模式大多數(shù)時(shí)候是同步的,比如當(dāng)事件觸發(fā),Subject就會(huì)去調(diào)用觀察者的方法。而發(fā)布-訂閱模式大多數(shù)時(shí)候是異步的(使用消息隊(duì)列)
舉個(gè)例子
觀察者模式就像你沒(méi)有經(jīng)驗(yàn)卻買了比特幣或者股票,然后害怕賠錢一直盯著k線圖,一有變化立馬就知道了,然后做下一步操作,是觀望是買是拋都可以,熟悉vue的同學(xué)應(yīng)該知道watch這個(gè)方法吧,對(duì),就是觀察者模式,國(guó)外有一圖拿過(guò)來(lái)給你們看看
1.觀察者模式 vs 發(fā)布-訂閱模式
2.Observer vs Pub-Sub
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/52418.html
摘要:發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個(gè)事件觸發(fā),只知道事件觸發(fā)時(shí)候,會(huì)告訴自己。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對(duì)方的存在。在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。 概念 發(fā)布訂閱者模式,是javascript甚至大多數(shù)語(yǔ)言都有的語(yǔ)言模式,比較概念的解釋是, 訂閱者把自己想訂閱的事件注冊(cè)到調(diào)度中心,當(dāng)該事件觸發(fā)時(shí)候,發(fā)布者發(fā)布...
摘要:觀察者模式維護(hù)單一事件對(duì)應(yīng)多個(gè)依賴該事件的對(duì)象關(guān)系發(fā)布訂閱維護(hù)多個(gè)事件主題及依賴各事件主題的對(duì)象之間的關(guān)系觀察者模式是目標(biāo)對(duì)象直接觸發(fā)通知全部通知,觀察對(duì)象被迫接收通知。 觀察者模式(Observer) 觀察者模式:定義了對(duì)象間一種一對(duì)多的依賴關(guān)系,當(dāng)目標(biāo)對(duì)象 Subject 的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象 Observer 都會(huì)得到通知。 簡(jiǎn)單點(diǎn):女神有男朋友了,朋友圈曬個(gè)圖,甜...
摘要:觀察者模式與發(fā)布訂閱的區(qū)別在模式中,知道,同時(shí)還保留了的記錄。發(fā)布者訂閱者在大多情況下是異步方式使用消息隊(duì)列。圖片源于網(wǎng)絡(luò)侵權(quán)必刪如果以結(jié)構(gòu)來(lái)分辨模式,發(fā)布訂閱模式相比觀察者模式多了一個(gè)中間件訂閱器,所以發(fā)布訂閱模式是不同于觀察者模式的。 學(xué)習(xí)了一段時(shí)間設(shè)計(jì)模式,當(dāng)學(xué)到觀察者模式和發(fā)布訂閱模式的時(shí)候遇到了很大的問(wèn)題,這兩個(gè)模式有點(diǎn)類似,有點(diǎn)傻傻分不清楚,博客起因如此,開始對(duì)觀察者和發(fā)布...
摘要:概念觀察者模式被廣泛地應(yīng)用于客戶端編程中。所有的瀏覽器事件,等都是使用觀察者模式的例子。在觀察者模式中,一個(gè)對(duì)象訂閱另一個(gè)對(duì)象的指定活動(dòng)并得到通知,而不是調(diào)用另一個(gè)對(duì)象的方法。此外,觀察者模式還可用于實(shí)現(xiàn)數(shù)據(jù)綁定。 概念 觀察者模式被廣泛地應(yīng)用于JavaScript客戶端編程中。所有的瀏覽器事件(mouseover,keypress等)都是使用觀察者模式的例子。這種模式的另一個(gè)名字叫自...
摘要:發(fā)布訂閱模式訂閱者把自己想訂閱的事件注冊(cè)到調(diào)度中心,當(dāng)發(fā)布者發(fā)布該事件到調(diào)度中心,也就是該事件觸發(fā)時(shí),由調(diào)度中心統(tǒng)一調(diào)度訂閱者注冊(cè)到調(diào)度中心的處理代碼。 發(fā)布-訂閱模式,看似陌生,其實(shí)不然。工作中經(jīng)常會(huì)用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他們都使用了發(fā)布-訂閱模式,讓開發(fā)變得更加高效方便。 一...
閱讀 2400·2021-09-08 09:45
閱讀 3340·2021-09-08 09:45
閱讀 3097·2019-08-30 15:54
閱讀 3348·2019-08-26 13:54
閱讀 1405·2019-08-26 13:26
閱讀 1384·2019-08-26 13:23
閱讀 909·2019-08-23 17:57
閱讀 2178·2019-08-23 17:14