1. 程式人生 > >設計模式(三)—— 釋出-訂閱模式

設計模式(三)—— 釋出-訂閱模式

1. 釋出訂閱模式和觀察者模式很相似,但並不等同

釋出訂閱模式是一種訊息正規化,訊息傳送者(釋出者)不會將訊息直接傳送給特定的接受者(訂閱者),而是將釋出的訊息分為不同的類別,通過一箇中間的訊息代理來排程訊息,釋出者無需瞭解有哪些訂閱者存在。同樣的,訂閱者也只接受自己感興趣的那一類訊息,無需瞭解釋出者是否存在。 釋出者和訂閱者都不知道彼此的存在,是完全的鬆耦合。

釋出者(publishers)的訊息不會直接傳送給特定的接收者(訂閱者)。

這裡寫圖片描述

觀察者模式中觀察者和被觀察是知道彼此的存在的,被觀察者一直保持著對所有觀察者的記錄,被觀察者傳送通知訊息時也是呼叫觀察者的更新方法。因此“觀察者”和“被觀察者”是相互依賴的。

兩者比較如下: 
這裡寫圖片描述

總結一下二者的主要區別:

(1)觀察者模式的被觀察者和觀察者之間是有依賴的,是緊耦合;釋出-訂閱模式的釋出者和訂閱者無直接依賴,通過訊息代理進行通訊,是鬆耦合的;
(2)觀察者模式大多是同步的,而釋出訂閱模式大多是非同步的;

(3)觀察者模式需要在單個應用程式地址空間中實現,釋出訂閱是交叉應用模式

2. 釋出-訂閱模式具體實現

和觀察者模式有些相似,只是把訂閱者列表的維護和新訊息通知的實現移到了訊息管理器(就是釋出者和訂閱者中間的訊息代理)中了。

有個寫得不錯的部落格: java實現釋出訂閱