摘要:觀察者模式觀察者模式一個對象主體根據(jù)它維護的一個對象列表觀察者,自動通知它們狀態(tài)的任何變化。觀察者模式是由具體目標直接調(diào)度的操作而發(fā)布訂閱模式是在調(diào)度中心調(diào)度,發(fā)布者與訂閱者不產(chǎn)生依賴。
觀察者模式(Observer)
觀察者模式:一個對象(主體)根據(jù)它維護的一個對象列表(觀察者),自動通知它們狀態(tài)的任何變化。(舉例說明,電商平臺關(guān)注(訂閱)一家店鋪(發(fā)布者)的鞋子,當鞋子上架之后店鋪就會發(fā)送消息給用戶(訂閱者);用戶(訂閱者)可以通過取消訂閱來取消推送消息接收。)
實際上是:主體對觀察者傳遞消息通知,觀察者必須將該消息通知訂閱到觸發(fā)事件對象上。
關(guān)系鏈: 目標 <--- 繼承 --- 具體目標(發(fā)布者)< -- 訂閱 -- 調(diào)度觀察者 --- > 具體觀察者(訂閱者) --- 繼承 ---> 觀察者
具體代碼實現(xiàn):
//觀察者列表 function ObserverList(){ this.observerList = []; } ObserverList.prototype.add = function( obj ){ return this.observerList.push( obj ); }; ObserverList.prototype.count = function(){ return this.observerList.length; }; ObserverList.prototype.get = function( index ){ if( index > -1 && index < this.observerList.length ){ return this.observerList[ index ]; } }; ObserverList.prototype.indexOf = function( obj, startIndex ){ var i = startIndex; while( i < this.observerList.length ){ if( this.observerList[i] === obj ){ return i; } i++; } return -1; }; ObserverList.prototype.removeAt = function( index ){ this.observerList.splice( index, 1 ); }; //目標 function Subject(){ this.observers = new ObserverList(); } Subject.prototype.addObserver = function( observer ){ this.observers.add( observer ); }; Subject.prototype.removeObserver = function( observer ){ this.observers.removeAt( this.observers.indexOf( observer, 0 ) ); }; Subject.prototype.notify = function( context ){ var observerCount = this.observers.count(); for(var i=0; i < observerCount; i++){ this.observers.get(i).update( context ); } }; //觀察者 function Observer(){ this.update = function(){ // 自定義行為 }; }發(fā)布-訂閱模式
發(fā)布訂閱模式:觀察者模式也可以說是發(fā)布訂閱模式,然而發(fā)布訂閱模式與觀察者模式不同之處就在于,添加了一個中介(調(diào)度中心)來避免發(fā)布者和訂閱者之間產(chǎn)生依賴關(guān)系。
關(guān)系鏈: 訂閱者(數(shù)量不限) --- 訂閱 ---> 調(diào)度中心 <--- 發(fā)布 --- 發(fā)布者(不直接發(fā)布)
兩種模式的區(qū)別:觀察兩種模式其實發(fā)現(xiàn),模式的基本思想是一致的,僅僅是在調(diào)度是否是直接調(diào)度上有所不同。觀察者模式是由具體目標直接調(diào)度的(eg: dom操作);而發(fā)布訂閱模式是在調(diào)度中心調(diào)度,發(fā)布者與訂閱者不產(chǎn)生依賴。
具體代碼實現(xiàn):
var pubsub = {}; (function(myObject) { // Storage for topics that can be broadcast // or listened to var topics = {}; // An topic identifier var subUid = -1; // Publish or broadcast events of interest // with a specific topic name and arguments // such as the data to pass along myObject.publish = function( topic, args ) { if ( !topics[topic] ) { return false; } var subscribers = topics[topic], len = subscribers ? subscribers.length : 0; while (len--) { subscribers[len].func( topic, args ); } return this; }; // Subscribe to events of interest // with a specific topic name and a // callback function, to be executed // when the topic/event is observed myObject.subscribe = function( topic, func ) { if (!topics[topic]) { topics[topic] = []; } var token = ( ++subUid ).toString(); topics[topic].push({ token: token, func: func }); return token; }; // Unsubscribe from a specific // topic, based on a tokenized reference // to the subscription myObject.unsubscribe = function( token ) { for ( var m in topics ) { if ( topics[m] ) { for ( var i = 0, j = topics[m].length; i < j; i++ ) { if ( topics[m][i].token === token ) { topics[m].splice( i, 1 ); return token; } } } } return this; }; }( pubsub ));
參考文獻:《Learning JavaScript Design Patterns》
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109277.html
摘要:觀察者模式與發(fā)布訂閱的區(qū)別在模式中,知道,同時還保留了的記錄。發(fā)布者訂閱者在大多情況下是異步方式使用消息隊列。圖片源于網(wǎng)絡侵權(quán)必刪如果以結(jié)構(gòu)來分辨模式,發(fā)布訂閱模式相比觀察者模式多了一個中間件訂閱器,所以發(fā)布訂閱模式是不同于觀察者模式的。 學習了一段時間設計模式,當學到觀察者模式和發(fā)布訂閱模式的時候遇到了很大的問題,這兩個模式有點類似,有點傻傻分不清楚,博客起因如此,開始對觀察者和發(fā)布...
摘要:發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個事件觸發(fā),只知道事件觸發(fā)時候,會告訴自己。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對方的存在。在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。 概念 發(fā)布訂閱者模式,是javascript甚至大多數(shù)語言都有的語言模式,比較概念的解釋是, 訂閱者把自己想訂閱的事件注冊到調(diào)度中心,當該事件觸發(fā)時候,發(fā)布者發(fā)布...
摘要:發(fā)布訂閱者模式中,訂閱者是不知道也不關(guān)心事件是為什么觸發(fā),是由哪一個事件觸發(fā),只知道事件觸發(fā)時候,會告訴自己。然而,在發(fā)布訂閱模式中,發(fā)布者和訂閱者不知道對方的存在。在發(fā)布訂閱模式中,組件是松散耦合的,正好和觀察者模式相反。 概念 發(fā)布訂閱者模式,是javascript甚至大多數(shù)語言都有的語言模式,比較概念的解釋是, 訂閱者把自己想訂閱的事件注冊到調(diào)度中心,當該事件觸發(fā)時候,發(fā)布者發(fā)布...
摘要:觀察者模式維護單一事件對應多個依賴該事件的對象關(guān)系發(fā)布訂閱維護多個事件主題及依賴各事件主題的對象之間的關(guān)系觀察者模式是目標對象直接觸發(fā)通知全部通知,觀察對象被迫接收通知。 觀察者模式(Observer) 觀察者模式:定義了對象間一種一對多的依賴關(guān)系,當目標對象 Subject 的狀態(tài)發(fā)生改變時,所有依賴它的對象 Observer 都會得到通知。 簡單點:女神有男朋友了,朋友圈曬個圖,甜...
閱讀 907·2021-09-22 15:17
閱讀 1936·2021-09-22 15:06
閱讀 2224·2021-09-08 09:35
閱讀 5113·2021-09-01 11:43
閱讀 3485·2019-08-30 15:55
閱讀 2159·2019-08-30 12:48
閱讀 3157·2019-08-30 12:45
閱讀 1791·2019-08-29 17:31