小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(“天氣炎熱”);
}
}
[運行結果]
天氣預報:
——
近期天氣變化:颱風‘珍珠’逼近
近期天氣變化:大到暴雨
近期天氣變化:天氣炎熱