理解並實現PubSub模式

2021-09-07 12:42:28 字數 1683 閱讀 5276

假如我們正在構建乙個類似於 google docs 的應用程式,當使用者按下乙個按鍵時,需要做的事情有很多: 新字元顯示到螢幕上;插入點向後移動;將本次動作加入到撤銷的歷史記錄中; 保持與伺服器同步;拼寫錯誤檢查;統計字數和頁數等等。

按照傳統的做法,假如我們監聽 keypress 事件,並在乙個處理中完成所有的任務,這想想都覺得可怕了。 那麼有沒有什麼方法可以更好的解決這個問題,答案就是分布式事件

pubsub 模式,是 publish/subscribe 的縮寫,意為「發布/訂閱」模式。

在實際使用中,我們應該也會接觸到 pubsub 模式,例如 nodejs 中的 eventemitter、backbone 中的事件模型、以及 jquery 中的事件。 以 eventemitter 為栗子,它提供了 addlistener(event, listener),removelistener(event, listener),emit(event, [arg1], [arg2], [...]) 方法。

var emitter = new eventemitter(),

fn1 = function(value) , fn2 = function(value) ; emitter.addlistener('message', fn1); emitter.addlistener('message', fn2); emitter.emit('message', 'test1'); emitter.removelistener('message', fn2); emitter.emit('message', 'test2'); //fn1: test1 //fn2: test1 //fn1: test2

當呼叫 emit 方法時,會觸發所有監聽的事件。

就像上面說的,pubsub 其實很簡單,現在我們來實現屬於我們自己的 pubsub 物件。

首先建立 pubsub 類,增加 handlers 變數用於儲存事件列表:

function pubsub() ; } 

新增事件時,將***加到陣列中:

pubsub.prototype.on = function(type, listener)  this.handlers[type].push(listener); }; 

刪除事件時,移除***:

pubsub.prototype.off = function(type, listener)  } if (position === -1)  if (length === 1)  else  }; 

觸發事件,迴圈遍歷並觸發所有的事件:

pubsub.prototype.emit = function(type) , fn2 = function(value) ; pubsub.on('message', fn1); pubsub.on('message', fn2); pubsub.emit('message', 'test1'); pubsub.off('message', fn2); pubsub.emit('message', 'test2'); //fn1: test1 //fn2: test1 //fn1: test2 

注:更多的實現請看 nodejs 中的 events.js。

**:

大數加法簡易理解並實現

第一次寫,寫得不好望見諒。使用c 語法,可用於杭電oj 1002。思路 字串模擬大數 字串倒序 一位位對齊後計算 好處 使進製更簡單 如果不逆序,判斷最高位是否進製後再確定存放的位置會較麻煩 缺陷 冗雜 無法加負數 無法加小數 多個零相加時仍出現多個零而不是單個零 心得 時時刻刻注意減去 0 的個數...

工廠模式(C C 實現理解)

如果b需要輸出c,c需要輸出b,怎麼處理。第一步是修改配置引數modulebinputpara與 modulecinputpara 第二步是修改介面infa0,增加兩條case項。簡單工廠模式 優點 b,c模組與a模組偶合小。b與c不需要修改 實現前提是將b,c 相關部分抽象成介面 infa0 缺點...

Javascript提示視窗並實現模式視窗功能

b 提示視窗的介面 b img img overlay floatdiv floatdiv divtitle floatdiv divcontent floatdiv divfoot floatdiv input.divbutton show 提示視窗 以前自已也有乙個部落格,寫了300多篇,後面工...