發佈訂閱者模式,是javascript甚至大多數語言都有的語言模式,比較概念的解釋是,javascript
訂閱者把本身想訂閱的事件註冊到調度中心,當該事件觸發時候,發佈者發佈該事件到調度中心(第三方),由調度中心統一調度訂閱者註冊到調度中心的處理代碼。
優勢
1.一對多。
一個發佈者能夠綁定多個訂閱者,當事件觸發時,由調度中心所有通知。
2.解耦。
發佈訂閱者模式中,訂閱者是不知道也不關心事件是爲何觸發,是由哪個事件觸發,只知道事件觸發時候,會告訴本身。發佈者也不用一一通知,只要告訴調度中心,事件觸發了就行了。因此代碼鬆耦合。
3.程序便於擴展。
缺點:
實現方式麻煩?vue
用平時身邊的例子解釋,好比你被阿里邀請面試,面試完你問面試官何時出結果,面試官告訴你結果出來時候會通知你的,這樣你就不用每天打電話問面試結果了,等面試結果出來,面試官會把面試結果統一發郵件給面試者,當你收到面試結果後,進行下一步操做,是到阿里上班,仍是面試下一家。java
var observer = function () { var _observer = {}; let _queue = {}; // 全部事件的隊列 /** * @param 註冊的事件名稱 * @param 事件觸發時執行的函數 */ _observer.on = function (eventName, fn) { if (Object.prototype.toString.call(fn) !== '[object Function]') return; if (_queue[eventName] && _queue[eventName].length > 0) { // 若是以前註冊過eventName事件 _queue[eventName].push(fn); } else { // 以前沒有註冊過eventName事件 _queue[eventName] = [fn]; } }, /** * @param 已經觸發的事件(發佈事件) */ _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); } }, // 移除註冊事件 _observer.remove = function (removeEventName) { for(var k in _queue) { if (k === removeEventName) { delete _queue[k]; } } } // 移除全部註冊事件 _observer.removeAll = function () { _queue = {}; } return _observer; }()
發佈訂閱者模式與觀察者模式是很類似的,以前的好多網站、博客上也把它們畫上等號,可是我前段時間接到一個面試,問我,發佈訂閱者模式與觀察者模式有什麼卻別,當時說同樣的,結果面試管說其實不同,好吧,一臉懵逼,結束時候本身查閱了一下,確實不太同樣。面試
區別app
舉個例子
觀察者模式就像你沒有經驗卻買了比特幣或者股票,而後懼怕賠錢一直盯着k線圖,一有變化立馬就知道了,而後作下一步操做,是觀望是買是拋均可以,熟悉vue的同窗應該知道watch這個方法吧,對,就是觀察者模式,國外有一圖拿過來給大家看看異步