觀察者模式與發布訂閱模式學習

2022-08-20 08:51:09 字數 2729 閱讀 3318

建立一種物件與物件之間的依賴關係,乙個物件發生改變時將自動通知其他物件,其他物件將相應做出反應。在此,發生改變的物件稱為觀察目標,而被通知的物件稱為觀察者,乙個觀察目標可以對應多個觀察者,而且這些觀察者之間沒有相互聯絡,可以根據需要增加和刪除觀察者,使得系統更易於擴充套件,當物件間存在一對多關係時,則使用觀察者模式(observer pattern)。

觀察者模式在軟體開發中應用非常廣泛,如某電子商務**可以在執行傳送操作後給使用者多個傳送商品打折資訊,某團隊戰鬥遊戲中某隊友犧牲將給所有成員提示等等,凡是涉及到一對一或者一對多的物件互動場景都可以使用觀察者模式。

/**

* 通過node事件觸發器 實現觀察者模式

*/const eventemitter = require('events')

class subject )

//設定state 觸發所有監聽_eventname事件的handler

setstate(newstate)

//將事件的handel 繫結到觀察者的update方法上

subscripe(fn)

//將觀察者的update方法從事件上解綁

unsubscripe(fn)

}//觀察者

class observer ;

} //傳入具體的響應handler

consume(fn)

//不在響應state的變化

nomoreconsume()

}function main() when state change`);

})const observertwo = new observer(subjectone);

observertwo.consume(state => when state change`);

})//被觀察者更改state 引起兩個觀察者的響應

subjectone.setstate('ya')

//觀察者one不在響應資料變化

observerone.nomoreconsume()

////被觀察者繼續更改state 只有two響應

subjectone.setstate('nan')

//觀察者two不再響應資料

observertwo.nomoreconsume()

//沒有觀察者響應了

subjectone.setstate('end')

}main();

執行結果: 

在發布-訂閱模式中,訊息的傳送方,叫做發布者(publishers),訊息的消費方叫做訂閱者,但是訊息不會直接傳送給訂閱者, 而是傳送到乙個第三方,它關聯發布者與訂閱者,存貯訊息的狀態(已消費,未消費)。

微服務之間的訊息推送,乙個服務產生的資料通過訊息佇列被多個服務使用

/*

* * 發布訂閱模擬

*/const eventemitter = require('

events')

/** * 發布

* todos 向某個訊息佇列傳送訊息 以供訂閱者消費

*/class

publisher

/*發布訊息

*/produce(message) `);

return

this

.mq.receivemessage(message);

}}/** 訂閱

* todos 1、訂閱某個主題 2 當主題有相關的訊息時能夠消費訊息,並給予反饋 */

class

subscriper

/*消費訊息

*/consume(fn) }/*

訊息佇列

*/class

messagequeue

/*接受訊息

*/receivemessage(message)

/*繫結訂閱者的**

*/bindconsumefn(fn)

/*將訊息傳送到訂閱者的**

*/notify() message didn'

t be consume!`);

if (this

.messages.length)

} },

3000

) }

/*刪除已消費的訊息

*/ack(message)

from messages!`);

}}//乙個test主題的mq佇列

const mq = new messagequeue('

test');

//生產者連線mq

const publisher = new

publisher(mq);

//消費者連線mq

const subscripter = new

subscriper(mq);

//每秒生產一條訊息

setinterval(_ =>`);

publisher.produce(message);

}, 1000

)subscripter.consume(message =>

from mq!`);

//確認消費已經消費

subscripter.mq.ack(message)

})

執行結果:

從表面上看:

往更深層次講:

從使用層面上講:

觀察者模式 與 發布訂閱模式

兩個模式的實現結構 觀察者模式 觀察者 observer 直接訂閱 subscribe 主題 subject 而當主題被啟用的時候,會觸發 fire event 觀察者裡的事件。觀察者模式定義了物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都將得到通知,並自動更新。觀察...

觀察者模式(發布訂閱模式)

簡介 觀察者模式 又被稱為發布 訂閱 public subscribe 模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件再狀態變化時,會通知所有的觀察者物件,使他們能夠自動更新自己。塊 public 發布動態 button 觀察者 粉絲 ...

觀察者模式 訂閱發布模式

觀察者模式是一種物件間的一對多依賴關係,當乙個物件的狀態發生變化時,所有依賴他的物件都將得到通知。通常運用在物件之間的訊息通訊中。比如現在有一群學生,可以組成小組,可以尋求幫助 class students askforhelp subject 向大家尋求幫助 this.tasks.foreach ...