17.第四篇:觀察者模式

本文摘自 《JavaScript 設(shè)計(jì)模式》張容銘 著 版權(quán)歸原作者所有

觀察者模式:又被稱作發(fā)布-訂閱者模式或消息機(jī)制,定義了一種依賴關(guān)系,解決了主體對象與觀察者之間功能的耦合

創(chuàng)建一個(gè)觀察者
// 將觀察者放在閉包中,當(dāng)頁面加載就立即執(zhí)行
var Observer = (function(){
  // 防止消息隊(duì)列暴露而被篡改故將消息容器作為靜態(tài)私有變量保存
  var _message = {};
  return {
    // 注冊信息接口
    regist : function () {};
    // 發(fā)布信息接口
    fire : function () {};
    // 移除信息接口
    remove : function() {};
  }
})();

實(shí)現(xiàn)消息注冊方法

regist : function () {
  // 如果此消息不存在則應(yīng)該創(chuàng)建一個(gè)該消息類型
  if(typeof _message[type] === 'undefined'){
    // 將動(dòng)作推入到該消息對應(yīng)的動(dòng)作執(zhí)行隊(duì)列中
    _message[type] = [fn];
    // 如果此消息存在
  }else{
    // 將動(dòng)作方法推入該消息對應(yīng)的動(dòng)作執(zhí)行序列中
    _message[type].push(fn);
  }
}

定義發(fā)布消息的方法

fire : function(type,args){
  // 如果該消息沒有被注冊,則返回
  if(!_message[type]) return;
  // 定義消息信息
  var events = {
    type : type, // 消息類型
    args : args || {} // 消息攜帶數(shù)據(jù)
  },
  i = 0, // 消息動(dòng)作循環(huán)變量
  len = _message[type].length; // 消息動(dòng)作長度
  // 遍歷消息動(dòng)作
  for(; i < len ; i ++) {
    // 依次執(zhí)行注冊的消息對應(yīng)的動(dòng)作序列
    _message[type][i].call(this,events);
  }
}

消息注銷方法

remove : function (type,fn) {
  // 如果消息動(dòng)作隊(duì)列存在
  if(_message[type] instanceof Array) {
    // 從最后一個(gè)消息動(dòng)作遍歷
    var i = _message[type].length - 1;
    for (; i >= 0 ; i--) {
      // 如果存在該動(dòng)作則在消息動(dòng)作序列中移除相應(yīng)動(dòng)作
      _message[type][i] === fn && _message[type].splice(i,1);
    }
  }
}
Observer.regist('test',function(e){
  console.log(e.type,e.args.msg);
})
Observer.fire('test',{msg:'傳遞參數(shù)'});  // test 傳遞參數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 接觸前端兩三個(gè)月的時(shí)候,那時(shí)候只是聽說設(shè)計(jì)模式很重要,然后我就去讀了一本設(shè)計(jì)模式的書,讀了一部分,也不知道這些設(shè)計(jì)...
    艱苦奮斗的侯小憨閱讀 3,197評論 2 39
  • javascript設(shè)計(jì)模式與開發(fā)實(shí)踐 設(shè)計(jì)模式 每個(gè)設(shè)計(jì)模式我們需要從三點(diǎn)問題入手: 定義 作用 用法與實(shí)現(xiàn) 單...
    穿牛仔褲的蚊子閱讀 4,494評論 0 13
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,131評論 2 17
  • 工廠模式 單體模式 模塊模式 代理模式 職責(zé)鏈模式 命令模式 模板方法模式 策略模式 發(fā)布-訂閱模式 中介者模式 ...
    HelloJames閱讀 1,082評論 0 6
  • 開頭總是平凡乏味的。還總是錯(cuò)漏百出的。 以前是那樣的。事情簡單考慮直線,一個(gè)開始只通向一個(gè)終點(diǎn)。沒有人批評你的做法...
    desperato閱讀 254評論 0 1

友情鏈接更多精彩內(nèi)容