2018-01-15 js觀察者模式設(shè)計(jì)

觀察者模式

當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都會(huì)得到通知,也簡(jiǎn)稱發(fā)布-訂閱模式。類似微信訂閱公眾號(hào),當(dāng)它有新的文章發(fā)表后,就會(huì)推送給我們所有訂閱的人

優(yōu)點(diǎn)
1.我們無(wú)需關(guān)注公眾號(hào)是否有新的文章發(fā)布
2.我們和公眾號(hào)沒(méi)有強(qiáng)耦合在一起,公眾號(hào)不關(guān)心誰(shuí)訂閱了它

自定義事件

現(xiàn)在我們想要實(shí)現(xiàn)這樣的功能,定義一個(gè)事件,它有以下功能

  • 監(jiān)聽(tīng)事件(訂閱公眾號(hào))
  • 觸發(fā)事件(公眾號(hào)發(fā)布)
  • 移除事件(取消關(guān)注公眾號(hào))
//代碼如下
var Event = (function(){
  var list = {},//存儲(chǔ)公眾號(hào)
      on,
      emit,
      remove;
  //監(jiān)聽(tīng)事件
  on = function(key,fn){
    if(!list[key]){
      list[key] = [];如果不存在key,創(chuàng)建
    }
    list[key].push(fn);//將回調(diào)函數(shù)存儲(chǔ)到對(duì)應(yīng)的key
  };
  //觸發(fā)事件
  emit = function(){
    var key = Array.prototype.shift.call(arguments);//獲取key值
    var msg = list[key];
    if(!msg || msg.length === 0){
      return false;//不存在對(duì)應(yīng)的回調(diào)函數(shù),返回false
    }
    for(var i = 0; i < msg.length; i++){
      msg[i].apply(this,arguments);//循環(huán)執(zhí)行回調(diào)函數(shù)
    }
  };
  //移除事件
  remove = function(key,fn){
    var msg = list[key];
    if(!msg){
      return false;//如果不存在事件 返回false
    }
    if(!fn){
     delete list[key];//沒(méi)有指定的回調(diào)函數(shù),則刪除key 可以理解公眾號(hào)下架了
    }else{
      for(var i = 0; i < msg.length; i ++){
        if(msg[i] === fn){
          msg.splice(i, 1);//刪除指定的回調(diào)函數(shù)
        }
      }
    }
  };
  // 返回對(duì)象
  return {
    on:on,
    emit:emit,
    remove:remove
  }
})();

var fn = function(data){
  console.log(data+"推送消息來(lái)啦~~~")
}
Event.on('click',fn);//訂閱公眾號(hào)
Event.emit('click',"2018.01.15")//發(fā)布公眾號(hào)
Event.remove('click',fn);//取消關(guān)注公眾號(hào)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,037評(píng)論 25 709
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 8,130評(píng)論 2 17
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 一、實(shí)用干貨 畫(huà)畫(huà)入門(mén)要多久?不到15分鐘! 繪畫(huà)初學(xué)者7宗罪,你犯幾則? 10個(gè)錯(cuò)誤觀念不利于學(xué)畫(huà)畫(huà) 送給初學(xué)者...
    Ordy閱讀 4,968評(píng)論 0 29
  • 人與人之間,存在著一條無(wú)形的紐帶,不管相互認(rèn)識(shí)與否,不論是否血緣關(guān)系。這條紐帶,就是愛(ài)。愛(ài)能使人們團(tuán)結(jié)起來(lái)。而分享...
    風(fēng)信子也閱讀 808評(píng)論 0 2

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