在不少資料和書籍中,他們二者是相等的,但事實真是這樣嗎?面試
首先看一下觀察者模式:異步
是一個對象,維護一個依賴列表,當狀態發生改變時,會自動通知它們 post
來自維基百科的定義code
這就比如:你對 Google 的某個職位很感興趣,但該職位目前已經沒有空缺,因而你給 HR 留下了你的電話,HR 保證當職位空缺時會通知你。同時對這個職位感興趣的候選人還有成百上千個,因此當職位空缺你們都會知道,若是你迴應了 HR 的通知,HR 就會聯繫你進行面試。server
角色對比:Google 公司就是一個 Subject 對象,維護了 Observers (像你同樣的候選人列表),當狀態改變(職位空缺)就會 notify 候選人對象
See the Pen Observer Pattern by 286810 (@286810) on CodePen.blog
而後看一下發布-訂閱模式:隊列
消息的發送方叫發佈者(publisher),消息不會直接發送給特定的訂閱者(subscriber)事件
意思就是發佈者和訂閱者不知道對方的存在。須要一個第三方組件,叫作信息中介,它將訂閱者和發佈者串聯起來,它過濾和分配全部輸入的消息。ip
來源: MSDN 博客
最後,看一下對比圖:
來源: developers-club
總結:
在觀察者模式中,Observers(觀察者)是知道Subject的,Subject一直保持對Observers(觀察者)進行記錄。然而,在發佈訂閱模式中,Publisher(發佈者)和Subscriber(訂閱者)不知道對方的存在。它們只有經過消息隊列進行通訊。
在發佈訂閱模式中,組件是低耦合的,正好和觀察者模式相反。
觀察者模式大多數時候是同步的,好比當事件觸發,Subject就會去調用觀察者的方法。而發佈-訂閱模式大多數時候是異步的(使用消息隊列)。
觀察者 模式須要在單個應用程序地址空間中實現,而發佈-訂閱更像交叉應用模式。
參考:https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c