Rxjs_觀察者模式和發佈訂閱模式
設計模式
撿起大學所學的《設計模式》吧 Orz
觀察者模式和發佈訂閱模式特別容易被人們混淆,很多書裏面也將這兩個概念混爲一談,所以首先要搞清楚這兩種模式的區別。
觀察者模式
╭─────────────╮ Fire Event ╭──────────────╮
│ │─────────────>│ │
│ Subject │ │ Observer │
│ │<─────────────│ │
╰─────────────╯ Subscribe ╰──────────────╯
觀察者其模式實很好理解,模式中只有兩種角色,觀察者和被觀察者。
觀察者模式屬於行爲型模式,用於建立一種對象與對象之間的依賴關係,一個對象發生改變時將自動通知其他對象,其他對象將相應作出反應。
Subject(目標) 目標又稱爲主題,它是指被觀察的對象。
Observer(觀察者) 觀察者將對觀察目標的改變做出反應
代碼例子:jQuery
function refresh() {
$('div').empty().text('you are stupid.')
$('div').trigger('refresh')
}
...
$('div').on('refresh', () => {
$('span').empty().text('go to find it.')
})
發佈-訂閱模式
╭─────────────╮ ╭───────────────╮ Fire Event ╭──────────────╮
│ │ Publish Event │ │───────────────>│ │
│ Publisher │────────────────>│ Event Channel │ │ Subscriber │
│ │ │ │<───────────────│ │
╰─────────────╯ ╰───────────────╯ Subscribe ╰──────────────╯
發佈訂閱模式屬於廣義上的觀察者模式
發佈訂閱模式與觀察者模式非常接近,僅僅只是多了一箇中間層用於管理消息(信息通道),可以看成是一種優化的觀察者模式。
生活中有一個很好的例子——廣播電臺,人們會把頻道調到他們最喜歡的節目。廣播站不知道觀衆聽得是什麼或者他們正在聽什麼,只需要發佈他們的節目就可以了。而觀衆也不知道廣播站製作節目的過程,他們只要在他們最喜歡的節目運行的時候把臺調到對應的頻道或者告知朋友就行。
觀察者模式和發佈-訂閱模式的比較
兩者的比較如下圖所示:
觀察者模式
- 必須知道具體的Subject,兩者可以直接聯繫
- 緊耦合
- 大多數是同步的
- 在單個應用程序地址空間中實現
發佈訂閱模式
- 無直接依賴關係,通過消息代理
- 鬆耦合
- 大多數是異步的(使用消息隊列)
- 交叉應用模式
參考鏈接《對象間的聯動——觀察者模式(二) - 設計模式之行爲型模式 - 極客學院Wiki》
[《[譯] 設計模式:發佈/訂閱模式解析 - 記錄技術的點滴 - SegmentFault 思否》][5]
《觀察者模式和發佈訂閱模式有什麼不同? - 知乎》