1. 程式人生 > >釋出訂閱者模式、觀察者模式總結

釋出訂閱者模式、觀察者模式總結

/** * 觀察者模式定義:Subject維持一系列它的物件Observer,當有關狀態發生變更時Subject物件則會通知一系列Observer物件進行更新。 * 在Subject物件添加了一系列Observer物件之後,Subject維持一系列Observer物件,當有關狀態發生變更時Subject物件則會通知這 * 一系列Observer物件進行更新 * splice講解(當前的索引,擷取的個數,增加的數字) * @param 1個引數 * @patam 2個引數 * @param 3個引數
*/ function Subject() { this. observers = []; } Subject. prototype = { add : function ( observer) { this. observers. push( observer); }, remove : function ( observer) { var observers = this. prototype
; for ( var i = 0; i < observers. length; i++) { if ( observers[ i] === observer) { this. observers. splice( i, 1) } } }, notify : function () { var observers = this. observers; for ( var
i = 0; i < observers. length; i++) { observers[ i]. notify(); } } }
var sub = new Subject(); var obs1 = new Observer( 't1'); var obs2 = new Observer( 't2'); Observer. prototype = { update : function () { console. log( 'my name is' + this. name); } } sub. add( obs1); sub. add( obs2); sub. notify(); /** * 釋出訂閱模式指的是希望接收通知的物件(Subscriber)基於一個主題通過自定義事件訂閱主題,被啟用事件的物件(Publisher)通過釋出主題事件的方式通知各個訂閱該主題的 Subscriber 物件。 * */ let pubSub = { list: {}, // 訂閱 subscribe : function ( key, fn) { if (! this. list[ key]) { this. list[ key] = []; }; this. list[ key]. push( fn); }, // 釋出 publish : function () { let arg = arguments; let key = []. shift. call( arg); let fns = this. list( key); if (! fns || fns. length <= 0) return; for ( var i = 0; i < fns. length; i++) { fns[ i]. apply( this, arg); } }, // 取消訂閱 unSubscribe : function ( key) { delete this. list[ key]; } } pubSub. subscribe( 'name', ( name) => { console. log( 'your name is' + name); })