天天看點

Java設計模式----觀察者模式詳解

【正文】

一、觀察者模式的定義:

簡單地說,觀察者模式定義了一個一對多的依賴關系,讓一個或多個觀察者對象監聽一個主題對象。這樣一來,當被觀察者狀态發生改變時,需要通知相應的觀察者,使這些觀察者對象能夠自動更新。例如:gui中的事件處理機制采用的就是觀察者模式。

二、觀察者模式的實作:

subject(被觀察的對象接口):規定concretesubject的統一接口 ; 每個subject可以有多個observer;

concretesubject(具體被觀察對象):維護對所有具體觀察者的引用的清單 ;–狀态發生變化時會發送通知給所有注冊的觀察者。

observer(觀察者接口):規定concreteobserver的統一接口;定義了一個update()方法,在被觀察對象狀态改變時會被調用。

concreteobserver(具體觀察者):維護一個對concretesubject的引用;特定狀态與concretesubject同步; 實作observer接口,update()方法的作用:一旦檢測到subject有變動,就更新資訊。

圖表描述如下:

Java設計模式----觀察者模式詳解

注:在被觀察者類中需要有一個集合維護所有觀察者。

三、舉例說明:

【方案一】:自己定義接口或者類來實作觀察者模式。

步驟如下:

(1)定義被觀察者所具有的接口:

Java設計模式----觀察者模式詳解
Java設計模式----觀察者模式詳解

(2)定義具體的被觀察者:杯子

Java設計模式----觀察者模式詳解
Java設計模式----觀察者模式詳解

(3)定義觀察者所具有的共同的接口:(更新資料最終當然是在觀察者那裡進行啦)

(4)定義具體的觀察者對象:

Java設計模式----觀察者模式詳解
Java設計模式----觀察者模式詳解

(5)測試:

Java設計模式----觀察者模式詳解
Java設計模式----觀察者模式詳解

運作後,顯示結果如下:

Java設計模式----觀察者模式詳解

【方案二】:直接調用jdk的api去實作。

(1) 通過繼承observable類實作具體的被觀察者對象:

Java設計模式----觀察者模式詳解
Java設計模式----觀察者模式詳解

(2)通過實作java.util.observer接口實作具體的觀察者對象:

Java設計模式----觀察者模式詳解
Java設計模式----觀察者模式詳解

(3)測試:

Java設計模式----觀察者模式詳解
Java設計模式----觀察者模式詳解

運作後,結果如下:

Java設計模式----觀察者模式詳解

【工程檔案】

密碼:hois

四、總結:(觀察者模式的作用)

觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的隻是一個具體觀察者清單。

        由于被觀察者和觀察者沒有緊密地耦合在一起,是以它們可以屬于不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個對象必然跨越抽象化和具體化層次。

觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知。