使用java.util.Observable類和java.util.Observer接口實現(xiàn)觀察者模式氣象站(拉、推均實現(xiàn),自己也可以按照它的實現(xiàn)方法擴展)
拉:也就是觀察者來決定接到“可觀察者”類通知時獲取“可觀察者”的哪些變化。調(diào)用方法notifyObservers();
推:“可觀察者”類通知觀察者時傳遞給觀察者自身所有的變化。調(diào)用方法notifyObservers(Object arg);
import java.util.Observable;
import java.util.Observer;
//此類實現(xiàn)的是“拉”的發(fā)式,繼承java.util.Observable類
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
//構(gòu)造器不需要為了記住觀察者們而建立數(shù)據(jù)結(jié)構(gòu)了
public WeatherData() { }
public void measurementsChanged() {
setChanged();//指示可觀察者狀態(tài)已改變(可以由狀態(tài)是否改變決定是否通知觀察者,很容易,自己實現(xiàn)就行)
notifyObservers();//沒有調(diào)用傳送數(shù)據(jù)對象,表示采用“拉”的做法
}
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;
}
}
import java.util.Observable;
import java.util.Observer;
//實現(xiàn)java.util.Observer接口,成為觀察者
public class CurrentConditionsDisplay implements Observer, DisplayElement {
Observable observable;
private float temperature;
private float humidity;
//構(gòu)造器需要Observable 作為參數(shù),并將本對象登記為觀察者
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
//改變update()方法,增加Observable 和數(shù)據(jù)對象為參數(shù)
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");
}
}
注意:java.util.Observable是一個類而不是接口,而且還沒有實現(xiàn)任何接口。它本身的實現(xiàn)有很多問題,限制了它的使用和復(fù)用。由于它是個類,所以我們只能繼承,java不允許多繼承,所以限制了其復(fù)用潛力。而且setChanged()方法被保護起來(被定義成protected),這就意味著除非繼承,否則無法創(chuàng)建實例并組合到自己的對象中,這就違背了設(shè)計原則“多用組合,少用繼承”。