在翻閱資料的時候,有人把觀察者(observer)模式等同于釋出(publish)/訂閱(subscribe)模式,也有人認為這兩種模式還是存在差異,而我認為确實是存在差異的,本質上的差別是排程的地方不同。
觀察者模式
比較概念的解釋是,目标和觀察者是基類,目标提供維護觀察者的一系列方法,觀察者提供更新接口。具體觀察者和具體目标繼承各自的基類,然後具體觀察者把自己注冊到具體目标裡,在具體目标發生變化時候,排程觀察者的更新方法。
比如有個“天氣中心”的具體目标a,專門監聽天氣變化,而有個顯示天氣的界面的觀察者b,b就把自己注冊到a裡,當a觸發天氣變化,就排程b的更新方法,并帶上自己的上下文。
釋出/訂閱模式
比較概念的解釋是,訂閱者把自己想訂閱的事件注冊到排程中心,當該事件觸發時候,釋出者釋出該事件到排程中心(順帶上下文),由排程中心統一排程訂閱者注冊到排程中心的處理代碼。
比如有個界面是實時顯示天氣,它就訂閱天氣事件(注冊到排程中心,包括處理程式),當天氣變化時(定時擷取資料),就作為釋出者釋出天氣資訊到排程中心,排程中心就排程訂閱者的天氣處理程式。
總結
1. 從兩張圖檔可以看到,最大的差別是排程的地方。
雖然兩種模式都存在訂閱者和釋出者(具體觀察者可認為是訂閱者、具體目标可認為是釋出者),但是觀察者模式是由具體目标排程的,而釋出/訂閱模式是統一由排程中心調的,是以觀察者模式的訂閱者與釋出者之間是存在依賴的,而釋出/訂閱模式則不會。
2. 兩種模式都可以用于松散耦合,改進代碼管理和潛在的複用。
附錄
觀察者模式實作代碼(javascript版):
釋出/訂閱模式實作代碼(javascript經典版):
參考文獻
本文為原創文章,轉載請保留原出處,友善溯源,如有錯誤地方,謝謝指正。
轉載:http://www.cnblogs.com/lovesong/p/5272752.html