发布订阅模式
發布訂閱模式,又叫做觀察者模式,描述對象間的一對多依賴關系。我舉幾個常見例子以便理解:報紙或雜志發布訂閱、js編程中的事件模型、手機流量超限制提醒等等
使用場景
應用于異步編程,替代傳統回調。
用它的好處是可以切換我們的關注點,關注點集中在訂閱事件,而在異步回調中我們需要關注內部運行狀態。取代對象之間的硬編碼機制,對象之間不必再顯式調用。
優點是對象間達到松耦合,缺點是當有多個發布者和訂閱者嵌套時,極難debug。實戰例子:
browser 中通過發布訂閱模式實現事件機制,可直接執行
let EventP=(() => {let clientList={}, //訂閱回調函數listen, //監聽器trigger,//觸發器remove;listen= (key,fn) => {if(! clientList[key]){clientList[key]=[];}clientList[key].push(fn);};trigger= (...rest) => {let key=rest.shift(),fns=clientList[key];if(!fns||fns.length===0){return false;}fns.forEach(function (val,index) {val.apply(this,rest);});}remove=(key,fn) => {let fns=clientList[key];if(!fns){return false;}if(!fn){fns && (fns.length =0);}else{fns.forEach(function (val,index) {if(val==fn){fns.splice(index,1);}});}};return{listen:listen,trigger:trigger,remove:remove,} })();EventP.listen('console',(info) => {console.log(info); })EventP.trigger('console','hello gcy'); //hello gcynode當中已內置實現,下面是應用案例
let util= require('util'); let events = require('events'); function PC() {events.EventEmitter.call(this); } // util.inherits //封裝了es5的Object.create util.inherits(PC,events.EventEmitter);//equivalent writing // function PC() { // events.EventEmitter.call(this); // for(let tmpName in Event.EventEmitter.prototype){ // this[tmpName]=Event.EventEmitter.prototype[tmpName]; // } // }let pcInstance=new PC(); /*** keyInput 可以添加多個listeners*/ pcInstance.on('keyInput',(track) => {console.log("track input",track); }); let inputEnd=() => {console.log("input End"); } pcInstance.on('keyInput',inputEnd);/***移除監聽,必須有引用*/ // pcInstance.removeListener('keyInput',inputEnd);pcInstance.emit('keyInput','hello world gcy');// ---------------------------------------------------------------------- // 對象組織事件名稱,以便維護,模塊復用 // let e={ // keyInput:'keyInput', // charge:'charge' // ........ // }//說明 在node中我認為event的出現是為了解決異步問題(一般是事件驅動型)。event的本質是觀察者模式的realize。它是base class之一
總結
 
                            
                        - 上一篇: 系统进化树的构建步骤和常用软件
- 下一篇: 朋友被裁员之后的工行、华为外包工作经历分
