觀察者模式 訂閱發布模式

2022-07-13 13:00:11 字數 2879 閱讀 3715

觀察者模式是一種物件間的一對多依賴關係,當乙個物件的狀態發生變化時,所有依賴他的物件都將得到通知。通常運用在物件之間的訊息通訊中。

// 比如現在有一群學生,可以組成小組,可以尋求幫助

class students

askforhelp(subject) , $$向大家尋求幫助!`)

this.tasks.foreach((fn) => );

}maketeam(student, fn) $與$$組成了學習小組!`);

student.tasks.push(fn);

}}const studentwango = new students('wango', '學神');

const studentlily = new students('lily', '學霸');

const studenttom = new students('tom', '平平無奇的');

const studentpeter = new students('peter', '學渣');

// 老師說peter的成績比較差,所以大家都和peter組成了學習小組

studentwango.maketeam(studentpeter, function(subject) 確實很難,我也花了好幾分鐘複習才堪堪得到了滿分!`);

})// 學神wango與學渣peter組成了學習小組!

studentlily.maketeam(studentpeter, function(subject) !? 背就完事了!`);

})// 學霸lily與學渣peter組成了學習小組!

studenttom.maketeam(studentpeter, function(subject) 的話,一定要好好學,但學不好也沒事,我們都是凡人!`);

})// 平平無奇的tom與學渣peter組成了學習小組!

// 有一天...

studentpeter.askforhelp('英語');

// 關於英語, 學渣peter向大家尋求幫助!

// wango說:英語確實很難,我也花了好幾分鐘複習才堪堪得到了滿分!

// lily說:英語!? 背就完事了!

// tom說:英語的話,一定要好好學,但學不好也沒事,我們都是凡人!

發布訂閱模並不在24種設計模式之中,只是觀察者模式的一種變體。相比觀察者模式,訂閱發布模式新增了乙個任務排程中心,訂閱者將自己想要訂閱的事件註冊到排程中心,當發布者發布該事件到排程中心,也就是觸發該事件時,由排程中心同一排程訂閱者註冊到排程中心的**。

// 同樣的學習小組

class students

// 訂閱事件

on(type, fn)

// 發布內容

emit(type, content)

}// 任務排程中心

class classroom :$`);

if (!classroom.topic[type] || classroom.topic[type].length === 0) 感興趣!`);

return;

}classroom.topic[type].foreach((fn) => );

}// 訂閱某個型別的事件

static subscribe(type, fn)

console.log(`有學生訂閱了$.`);

classroom.topic[type].push(fn);

}}const studentwango = new students('wango', '學神');

const studentlily = new students('lily', '學霸');

const studenttom = new students('tom', '平平無奇的');

const studentpeter = new students('peter', '學渣');

studentwango.on('life', function(type, content) )

// 有學生訂閱了life.

studentwango.on('english', function(type, content) )

// 有學生訂閱了english.

studenttom.on('english', function(type, content) )

// 有學生訂閱了english.

studentlily.on('english', function(type, content) )

// 有學生訂閱了english.

studentlily.emit('life', '這個世界有英雄嗎?');

// life:這個世界有英雄嗎?

// wango說: 終於有人問生活上的問題了,果然還是做個凡人比較快樂啊!

studenttom.emit('english', '單詞記不住怎麼辦啊?');

// english:單詞記不住怎麼辦啊?

// wango說:英語確實很難,我也花了好幾分鐘複習才堪堪得到了滿分!

// tom說:英語的話,一定要好好學,但學不好也沒事,我們都是凡人!

// lily說: 英語?! 背就完事了!

studentpeter.emit('game', '學什麼?玩遊戲啊!');

// game:學什麼?玩遊戲啊!

// 然而並沒有學生對game感興趣!

相比觀察者模,訂閱發布模式中的的訂閱者和發布者分離更加徹底。訂閱者在訂閱的時候只關注事件本身,而不用關心是誰發布的資訊;而發布者同樣只需要關注發布的內容,不用關心是誰在訂閱,如何處理。

總的來說,儘管訂閱發布模式多了個排程中心,但使用起來可以更加靈活,對多事件的支援更好,當然,記憶體消耗更大,畢竟要為維護多個事件佇列。

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

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

發布訂閱者模式 觀察者模式總結

觀察者模式定義 subject維持一系列它的物件observer,當有關狀態發生變更時subject物件則會通知一系列observer物件進行更新。在subject物件新增了一系列observer物件之後,subject維持一系列observer物件,當有關狀態發生變更時subject物件則會通知這...

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

我曾經在面試中被問道,觀察者模式和發布訂閱模式的有什麼區別?我迅速回憶起 head first設計模式 那本書 發布 訂閱 觀察者模式 我知道了,我知道了,別想騙我 我微笑著回答 沒有區別,它們是一樣的。但是面試官笑了,不,它們不一樣。我當時的表情 所以是我錯了嗎?之後我回到家開啟google查詢答...