天天看點

觀察者模式與釋出/訂閱模式差別

在翻閱資料的時候,有人把觀察者(observer)模式等同于釋出(publish)/訂閱(subscribe)模式,也有人認為這兩種模式還是存在差異,而我認為确實是存在差異的,本質上的差別是排程的地方不同。

觀察者模式

比較概念的解釋是,目标和觀察者是基類,目标提供維護觀察者的一系列方法,觀察者提供更新接口。具體觀察者和具體目标繼承各自的基類,然後具體觀察者把自己注冊到具體目标裡,在具體目标發生變化時候,排程觀察者的更新方法。

比如有個“天氣中心”的具體目标a,專門監聽天氣變化,而有個顯示天氣的界面的觀察者b,b就把自己注冊到a裡,當a觸發天氣變化,就排程b的更新方法,并帶上自己的上下文。

觀察者模式與釋出/訂閱模式差別

釋出/訂閱模式

比較概念的解釋是,訂閱者把自己想訂閱的事件注冊到排程中心,當該事件觸發時候,釋出者釋出該事件到排程中心(順帶上下文),由排程中心統一排程訂閱者注冊到排程中心的處理代碼。

比如有個界面是實時顯示天氣,它就訂閱天氣事件(注冊到排程中心,包括處理程式),當天氣變化時(定時擷取資料),就作為釋出者釋出天氣資訊到排程中心,排程中心就排程訂閱者的天氣處理程式。

觀察者模式與釋出/訂閱模式差別

總結

1. 從兩張圖檔可以看到,最大的差別是排程的地方。

雖然兩種模式都存在訂閱者和釋出者(具體觀察者可認為是訂閱者、具體目标可認為是釋出者),但是觀察者模式是由具體目标排程的,而釋出/訂閱模式是統一由排程中心調的,是以觀察者模式的訂閱者與釋出者之間是存在依賴的,而釋出/訂閱模式則不會。

2. 兩種模式都可以用于松散耦合,改進代碼管理和潛在的複用。

附錄

觀察者模式實作代碼(javascript版):

觀察者模式與釋出/訂閱模式差別
觀察者模式與釋出/訂閱模式差別

釋出/訂閱模式實作代碼(javascript經典版):

觀察者模式與釋出/訂閱模式差別
觀察者模式與釋出/訂閱模式差別

參考文獻

本文為原創文章,轉載請保留原出處,友善溯源,如有錯誤地方,謝謝指正。

轉載:http://www.cnblogs.com/lovesong/p/5272752.html

繼續閱讀