氣象站觀測氣象得出數據,數據發生變化後將數據分析後將信息更新在公佈欄上,現在有三種公佈欄:CurrentConditionsDisplay, statisticsDisplay, ForecastDisplay。
問題來了:以後可能會增加更多的公佈欄公佈各種信息或者刪除已經存在的公佈欄,就像報社每天將報紙送到給每個訂閱報紙的人家裏,可是有的人可能訂閱一段時間後就不想再看了,有退訂報紙,有的人沒看過要訂閱這個報紙。
觀察者模式:在對象之間定義一對多的依賴,這樣一來,當一個對象改變狀態,依賴他的對象都會收到通知,並自動更新。
觀察者模式定義了對象之間一對多的關係,觀察者和可觀察者之間用鬆耦合方式結合,可觀察者不知道觀察者的細節,只知道觀察者實現了觀察者接口。使用此模式時,你可以從被觀察者處推(push)或拉(pull)數據(然而,推的方式被認爲更“正確”)。有多個觀察者時,不可以依賴特定的通知次序。Java中有多種觀察者模式的實現,包括了通用的java.util.Observer和對應的java.util.Observable;。Swing大量使用觀察者模式(ActionListener),許多GUI框架也是如此。
使用jaa.util.Observer和java.util.Observable時,注意Observable是一個類,而Observer是一個接口。
注意Observable類中的setChanged()方法,setChanged()方法可以讓你在更新觀察者時,有更多的彈性,你可以更適當得通知觀察者,比方說,如果沒有setChanged()方法,我們的氣象站測量是如此敏感,以致於溫度計讀數每十分之一度就會更新,這會造成WeatherData對象持續不斷地通知觀察者,我們並不希望看到這樣的事情發生。
public void measurementsChanged() {
setChanged(); //使更加具有彈性
notifyObservers();
}