釋出訂閱者模式、觀察者模式總結
阿新 • • 發佈:2018-11-05
/**
* 觀察者模式定義: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); })
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); })