簡體中文 | 繁體中文

大話設計模式-----第62章


極品保鏢 足球之徵服世界 醜女奪夫記 變身之輪迴境界 夏日晚晴天 容我緩緩,來時遲 愛在永恆 紙鶴 隱婚萌妻:老公情深不換 萬界至霸 聖龍圖騰 異世之血染江湖路 重生煉氣師 EXO之戀上萌寵公主殿下 寄宿 無限之李帥西傳奇 怨靈 我和牌位結了婚 蜀山伏妖記 重拾良
第62章

小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(“天氣炎熱”);

}

}

[執行結果]

天氣預報:

——

近期天氣變化:颱風‘珍珠’逼近

近期天氣變化:大到暴雨

近期天氣變化:天氣炎熱

推薦小說