觀察者模式是一種物件間的一對多依賴關係,當乙個物件的狀態發生變化時,所有依賴他的物件都將得到通知。通常運用在物件之間的訊息通訊中。
// 比如現在有一群學生,可以組成小組,可以尋求幫助
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查詢答...