設(shè)計(jì)模式:發(fā)布訂閱模式, 觀察者模式

發(fā)布訂閱模式 和 觀察者模式

發(fā)布訂閱并不是觀察者模式。但我覺(jué)得沒(méi)有必要細(xì)究這個(gè)……同樣的思路不同的寫(xiě)法而已。另外看了這么久,我還是沒(méi)懂訂閱、發(fā)布、觀察這三個(gè)詞是什么意思……

發(fā)布訂閱模式

發(fā)布訂閱的核心是調(diào)度中心;是指由一個(gè)中心來(lái)進(jìn)行事務(wù)的發(fā)布和訂閱;就像Node中的Event模塊。
使用的方式如下:

var event = new Event();

//訂閱消息
event.on("test", function () {
  console.log("發(fā)布消息");
});

// 觸發(fā)
event.emit("test");

要實(shí)現(xiàn)這樣一個(gè)發(fā)布訂閱模式是非常簡(jiǎn)單的;當(dāng)然是實(shí)現(xiàn)一個(gè)簡(jiǎn)陋版本的……

var Event = function () {
  this.events = {};
}

Event.prototype.on = function (task, callback) {
  var list = this.events[task];
  list ? list.push(callback) : list = [callback];
}

Event.prototype.emit = function (task) {

  var events = this.events;

  if (!events[task]) {
    return false;
  }

  for (var i = 0; i < events.length; i++) {
    events[i]();
  }
}

觀察者模式

觀察者模式與發(fā)布訂閱模式不同的是,觀察者模式一般有兩個(gè)模塊,發(fā)布者和訂閱者(從這點(diǎn)聽(tīng)更應(yīng)該叫發(fā)布/訂閱模式才對(duì)啊……真的是)。簡(jiǎn)單來(lái)講就是分化為兩個(gè)模塊,發(fā)布者訂閱觀察者并手動(dòng)觸發(fā)事件,觀察者定義事件。

class Subject {
  constructor() {
    this.observerList = []
  }
  addObserver(observer) {
    this.observerList.push(observer)
  }
  notify(params) {
    this.observerList.forEach(observer => {
      observer.update(params)
    })
  }
}

// 觀察者類
class Observer {
  constructor(fn) {
    this.update = fn
  }
}
最后編輯于
?著作權(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)容

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