【正文】
一、觀察者模式的定義:
簡單地說,觀察者模式定義了一個一對多的依賴關系,讓一個或多個觀察者對象監聽一個主題對象。這樣一來,當被觀察者狀态發生改變時,需要通知相應的觀察者,使這些觀察者對象能夠自動更新。例如:gui中的事件處理機制采用的就是觀察者模式。
二、觀察者模式的實作:
subject(被觀察的對象接口):規定concretesubject的統一接口 ; 每個subject可以有多個observer;
concretesubject(具體被觀察對象):維護對所有具體觀察者的引用的清單 ;–狀态發生變化時會發送通知給所有注冊的觀察者。
observer(觀察者接口):規定concreteobserver的統一接口;定義了一個update()方法,在被觀察對象狀态改變時會被調用。
concreteobserver(具體觀察者):維護一個對concretesubject的引用;特定狀态與concretesubject同步; 實作observer接口,update()方法的作用:一旦檢測到subject有變動,就更新資訊。
圖表描述如下:

注:在被觀察者類中需要有一個集合維護所有觀察者。
三、舉例說明:
【方案一】:自己定義接口或者類來實作觀察者模式。
步驟如下:
(1)定義被觀察者所具有的接口:
(2)定義具體的被觀察者:杯子
(3)定義觀察者所具有的共同的接口:(更新資料最終當然是在觀察者那裡進行啦)
(4)定義具體的觀察者對象:
(5)測試:
運作後,顯示結果如下:
【方案二】:直接調用jdk的api去實作。
(1) 通過繼承observable類實作具體的被觀察者對象:
(2)通過實作java.util.observer接口實作具體的觀察者對象:
(3)測試:
運作後,結果如下:
【工程檔案】
密碼:hois
四、總結:(觀察者模式的作用)
觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的隻是一個具體觀察者清單。
由于被觀察者和觀察者沒有緊密地耦合在一起,是以它們可以屬于不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個對象必然跨越抽象化和具體化層次。
觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知。