1. 程式人生 > 實用技巧 >“Head First 設計模式“ :觀察者模式

“Head First 設計模式“ :觀察者模式

觀察者模式


觀察者模式定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新。一方可稱為主題(subject),另一方可稱為觀察者(observer),一個主題可擁有多個觀察者。當主題的資料有變動時,就會通知所有訂閱了它的觀察者。在這之後的操作有兩種:

  • :主題直接將資料推送給所有觀察者。

  • :主題通知了所有觀察者後,每個觀察者再根據自己的需要從主題拉取所需資料。

現實中的列子: 報紙出版社+訂閱者=觀察者模式,找工作+獵頭=觀察者模式


概念圖:

image.png

UML圖:

image.png


我們看一個列子

需求:Internet氣象站需求

描述:跟蹤氣象站的資料,有變化時更新WeatherData物件,並最新資訊顯示在對應的顯示器上,如下:

image.png


我們分析需求:

1. 一對多關係(不同的資料顯示在對應的佈告板上,如:溼度,溫度等)。

2. 氣象資料有變化時更新最新值並顯示在佈告板。

很適合觀察者模式來實現,最終實現的UML圖如下(程式碼省略):

image.png

JAVA內建支援觀察者模式

注意:JAVA內建支援觀察者模式,Subject是類不是介面,導致必須用繼承,java本身不支援多繼承,所以導致層次問題,不靈活。建議自己實現。

java.util.Observable(主題)

java.util.Observer(觀察者)

我們用內建方法實現上面的列子,類圖如下:

spacer.gifimage.png


總結;

觀察者模式的應用場景:

1、 對一個物件狀態的更新,需要其他物件同步更新,而且其他物件的數量動態可變。

2、 物件僅需要將自己的更新通知給其他物件而不需要知道其他物件的細節。


設計原則:為了互動物件之間的鬆耦合設計而努力。


轉載於:https://blog.51cto.com/u2r2otkit/2097472