小A:“那它的組成部分哩?是不是就是有觀察者和被觀察者的就是屬於觀察者模式?”
大B:“不是。1、抽象目標角色:目標角色知道它的觀察者,可以有任意多個觀察者觀察同一個目標。並且提供註冊和刪除觀察者物件的介面。目標角色往往由抽象類或者介面來實現。2、抽象觀察者角色:為那些在目標發生改變時需要獲得通知的物件定義一個更新介面。抽象觀察者角色主要由抽象類或者介面來實現。3、具體目標角色:將有關狀態存入各個具體觀察者角色物件。當它的狀態發生改變時,向它的各個觀察者發出通知。4、具體觀察者角色:儲存有關狀態,這些狀態應與目標的狀態保持一致。實現觀察者角色的更新介面以使自身狀態與目標的狀態保持一致。在這個角色內也可以維護一個指向具體目標角色物件的引用。”
大B:“用一個實際的例子來說明:日常生活中說起觀察者,最常見的例子可能就是天氣預報,在這裡我們的觀察物件是地球,而我們是透過發射氣象衛星這個觀察者來檢測地球氣象變化的。”
所以這個例子中涉及三個物件:
地球(Earth):被觀察物件
氣象衛星(Satellite):觀察者
氣象局(WeatherService):客戶端呼叫
被觀察物件:地球(Earth)
importjava.util.Observable;
/***//**
*被觀察物件:地球
*
*@version1.0
*/
publicclassEarthextendsObservable{
privateStringweather=“晴朗”;
/***//**
*@returnReturnstheweather.
*/
publicStringgetWeather(){
returnweather;
}
/***//**
*@paramweather
*Theweathertoset.
*/
publicvoidsetWeather(Stringweather){
this.weather=weather;
//設定變化點
setChanged();
notifyObservers(weather);
}
}
[注意]在需檢測的物件前需要設定變化點setChanged()和通知觀察者notifyObservers(),這兩個函式是由Observable類實現的,封裝了觀察者模式實現的細節。
觀察者:氣象衛星(Satellite)
importjava.util.Observable;
importjava.util.Observer;
/***//**
*觀察物件:氣象衛星
*
*@version1.0
*/
publicclassSatelliteimplementsObserver{
privateStringweather;
publicvoidupdate(Observableobj,Objectarg){
weather=(String)arg;
//捕獲天氣變化情況,反饋給檢測者
System.out.println(近期天氣變化:+weather);
}
}
客戶端呼叫:氣象局(WeatherService)
/***//**
*客戶端呼叫:天氣預報
*
*@version1.0
*/
publicclassWeatherService{
/***//**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Earthearth=newEarth();
Satellitesatellite=newSatellite();
//發射氣象衛星
earth.addObserver(satellite);
System.out.println(天氣預報:);
System.out.println(“——”);
earth.setWeather(“颱風‘珍珠’逼近”);
earth.setWeather(“大到暴雨”);
earth.setWeather(“天氣炎熱”);
}
}
[執行結果]
天氣預報:
——
近期天氣變化:颱風‘珍珠’逼近
近期天氣變化:大到暴雨
近期天氣變化:天氣炎熱