js中的觀察者模式

2021-08-19 20:42:21 字數 2487 閱讀 7004

//如下實現乙個通用發布者

//定義發布者物件...{}是定義乙個物件

var publisher = ,

subscribe: function(fn,type)

this.subscribers[type].push(fn);

},unsubscribe: function(fn,type),

publish: function(publication, type),

visitsubscribers: function(action,arg,type) else }}

}};//定義乙個函式makepublisher(),它接受乙個物件作為物件,通過把上述通用發布者的方法複製到該物件中,從而將其轉換為乙個發布者

function makepublisher(o)

}o.subscribers = ;

}//實現*****物件

var ***** = ,

monthly: function()

};//將*****構造成乙個發布者

makepublisher(*****); //makepublisher方法把發布者publisher的方法複製到*****物件中,從而使其成為乙個發布者

//以上已經有了乙個發布者。看看訂閱物件joe,該物件有兩個方法:註冊時,將此方法傳入*****的訂閱方法,完成註冊,則在發布訊息時會呼叫該方法

var joe = ,

sundayprenap : function(monthly)

};//*****註冊joe(即joe向*****訂閱)

*****.subscribe(joe.drinkcoffee); //訂閱any型別

*****.subscribe(joe.sundayprenap,'monthly'); //定義monthly型別

//即joe為預設「any」事件提供了乙個可被呼叫的方法,而另乙個可被呼叫的方法則用於當「monthly」型別的事件發生時的情況。現在讓我們來觸發一些事件:

*****.daily(); //just readbig news today

*****.monthly(); //about to fall asleep reading thisinteresting analysis

var jack =

};*****.subscribe(jack.read*****);

*****.daily(); //輸出: just readbig news today jack readbig news today

//以上**的好處在於,*****物件並沒有硬編碼joe,而joe中也並沒有硬編碼*****。此外,**中也沒有那些知道一切的中介者物件。由於參與物件是松耦合的,我們可以向*****新增更多的訂閱者而根本不需要修改這些物件。

//進一步擴充套件,讓joe成為發布者(比如:部落格和微博上任何人都可以是發布者)

makepublisher(joe);

joe.tweet = function(msg) ;

//現在,*****的公關部門決定讀取讀者的tweet,並訂閱joe的資訊,那麼需要提供方法readtweets():

*****.readtweets = function(tweet);

joe.subscribe(*****.readtweets); //*****訂閱joe的tweet

joe.tweet('hello the world!'); //call big meeting! someone hello the world!

另一種思路

var event = ;

} if(!this.handles[eventname])

this.handles[eventname].push(callback);

},// 觸發事件 eventname

emit: function (eventname) }}

};// 測試1

event.on('test', function (result) );

event.on('test', function () );

event.emit('test', 'hello world'); // 輸出 'hello world' 和 'test'

var person1 = {};

var person2 = {};

object.assign(person1, event);

object.assign(person2, event);

person1.on('call1', function () );

person2.on('call2', function () );

person1.emit('call1'); // 輸出 'person1'

person1.emit('call2'); // 沒有輸出

person2.emit('call1'); // 沒有輸出

person2.emit('call2'); // 輸出 'person2'

Js 觀察者模式

function eventtarget eventtarget.prototype this.handlers type push handler fire function event if this.handlers event.type instanceof array removehand...

JS 觀察者模式

被觀察者 function observed 將observer註冊到observed上 observed.prototype.attach function s 產生新狀態 observed.prototype.setstate function newstate 觀察者 function obs...

js 觀察者模式

觀察者模式定義一種一對多的關係,多個觀察者訂閱乙個主題物件,當主題物件發生改變的時候通知所有觀察者,使他們能實現更新。具體實現方式 定義乙個被觀察物件,定義乙個主題陣列,觀察者訂閱主題通過往陣列物件內新增 函式來實現,當主題發生改變時輪流呼叫 函式。var subpub this.topics to...