2007年5月26日 星期六

深入淺出設計模式_part2(觀察者模式)



觀察者模式
定義了物件的一對多關係,如此一來當一個物件改變狀態,其他相依者都會收到通知並自動更新。

設計守則:設計盡量讓需要互動的物件之間關係鬆綁。

EX:利用java.util.Observable & java.util.Observer來實踐觀察者模式

package headfirst.observer.weatherobservable;

import java.util.Observable;
import java.util.Observer;

//WeatherData為一個主題(被觀察者)
public class WeatherData extends Observable {
//需要改變的三個有關於天氣的參數
private float temperature;
private float humidity;
private float pressure;

public WeatherData() { }

//自訂的方法,用來改變觀察者的天氣參數
public void measurementsChanged() {
//設定旗標,可增加更新觀察者的彈性,可設定多次才更新或到一定值才更新,此方法繼承 自Observable類別
setChanged();
/**
setChanged(){
changed=true;
}
**/
//在旗標設定為true時通知觀察者,此方法繼承自Observable類別
notifyObservers();
/**
notifyObservers(Object org){
if(change){
for every observer on the list{
call update(this,org);
}
}
}

**/
}

public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}

public float getTemperature() {
return temperature;
}

public float getHumidity() {
return humidity;
}

public float getPressure() {
return pressure;
}
}


package headfirst.observer.weatherobservable;

import java.util.Observable;
import java.util.Observer;

//觀察者,實做Observer介面及一個自訂的顯示介面DisplayElement
public class CurrentConditionsDisplay implements Observer, DisplayElement {
Observable observable;
private float temperature;
private float humidity;

//將自己新增為一個觀察者
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}

//接受通知,改變自己的狀態並顯示
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData)obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}

//實踐自訂的顯示介面
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}

沒有留言: