在了解observer pattern 之前,先看看乙個天氣監控系統的設計:
在這個系統中包含三個部分:weather station(通過感測器實時獲取資料),weatherdata 物件(跟蹤weather station傳輸過來的 資料並且更新顯示介面),display device(顯示當前有關天氣資料)。
以下是weatherdata物件的大致設計:
現在第一步要做的是實現measurementschanged()方法,通過它來更新當前狀況、
天氣資料、
天氣預報資訊。(這裡切記有三個顯示元素)。
在實現這個系統的時候同時還要考慮到可擴充套件性,將來我們可能對顯示要素進行不斷擴充套件或刪除。
以下是對實現measurementschanged()方法進行的第一次嘗試:
public class weatherdata
}
按照以上的實現的方法,如果我想再增加乙個顯示元素,那麼我不得不對上面的**進行修改,所以很難維護。
對於這種問題我們可以利用observer pattern,在現實生活中我們經常可以看到observer pattern的影子,比如對報紙的訂閱,假設某報紙被三個使用者甲、乙、丙訂閱,那麼每當有新版本的報紙發布,他們每人都會得到乙份,如果有一天甲使用者打**給出版商取消訂閱,那麼他就不會繼續得到這種服務,如果某一天使用者丁覺得這報紙不錯,決定訂閱,那麼他就會收到新版的報紙。
observer pattern的定義:定義了物件之間一對多的相互依賴關係,所以當乙個物件(subject)改變狀態的時候,所有依賴這個物件的物件(observers)將會收到通知並做相應的更新。
observer pattern的類圖定義:
從上圖看出(1)只要物件實現了observer介面,就可以成為subject中observers變數中的一員
。(2)subject可以隨時增加或去除observer物件。(3)任何普通的物件都能夠成為observer,只要實現observer介面,並不需要對物件本身做任何改變。(4)我們可以將subject和observer物件用作別的用途,因為他們之間的關係不太緊密(低耦合),增加了**重用性。(5)我們可以隨意改動
subject和
observer物件,因為他們之間互不影響(低耦合),只要他們實現
subject介面或observer介面。
在這裡引入另乙個設計準則:在設計相互互動的物件時,盡量使這些物件之間處於低耦合的狀態。
我們現在可以將上面的設計方法用於對天氣監控系統的設計,將weatherdata物件視為subject,將各種顯示元素視為observer:
下面實現以上設計:
1.介面設計:
public inte***ce subject
public inte***ce observer
public inte***ce displayelement
2.weatherdata物件設計:
public class weatherdata implements subject
public void registerobserver(observer o)
public void removeobserver(observer o) }
public void notifyobservers() }
public void measurementschanged()
public void setmeasurements(float temperature,float humidity,float pressure)
}
3.顯示元素設計:
public class currentconditionsdisplay implements observer, displayelement
@override
public void display()
@override
public void update(float temperature, float humidity, float pressure)
}
4.測試**:
public class weatherstation
}
設計模式觀察者模式 ObserverPatern
核心模組 抽象觀察者,具體觀察者,抽象主題,具體主題 使用場景 乙個物件的改變將導致乙個或多個其他物件也發生改變,適合一對一或者一對多的場景 優點 主題和觀察者之間松耦合 觀察者並不需要知道主題發生了什麼變化 符合opc原則 新增觀察者只需要實現抽象觀察者 支援廣播 一對多 缺點 如果觀察者較多,抽...
設計模式 設計模式
物件導向程式設計 oop 的基本概念有 封裝,抽象,繼承,多型等,如何開發出可復用的物件導向軟體一直困擾著軟體開發人員。可復用的物件導向技術包括類的繼承,物件的組合和引數化型別 generic gof的巨著 設計模式 總結出可復用的物件導向的23個設計模式,並且歸類成 建立型模式,結構型模式和行為型...
設計模式 命令設計模式
一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...