Current coditions: 82.0F degress and 70.0% humidity
Avg/Max/Min temperature = 81.0/82.0/80.0
Forcast:
Watch out for cooler, rainy weather
Heat index is 86.90124
Current coditions: 78.0F degress and 90.0% humidity
Avg/Max/Min temperature = 80.0/82.0/78.0
Forcast:
more of the same
Heat index is 83.64967
以上的观察者模式实现是通过主题以“推”的方式通知观察者们,观察者可以在一次通知中一口气得到所有东西。
因为观察者与主题发生了争吵,观察者有自己的想法,希望能“拉”走主题的状态,然而Java内置的Observer模式就支持这样,下面来看看吧。
1. 继承Observable类的WeatherData(不再需要自定义接口了,但这样真的好吗?)
[java]
package weatherObservable;
import java.util.Observable;
/**
* 使用Java内置的观察者模式
* @author wwj
*
*/
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
/**
* 我们的构造器不再需要为了记住观察者们而建立数据结构了
*/
public WeatherData(){}
public void measurementsChanged() {
setChanged(); //Observable类方法
notifyObservers();
}
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 weatherObservable;
import java.util.Observable;
/**
* 使用Java内置的观察者模式
* @author wwj
*
*/
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
/**
* 我们的构造器不再需要为了记住观察者们而建立数据结构了
*/
public WeatherData(){}
public void measurementsChanged() {
setChanged(); //Observable类方法
notifyObservers();
}
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;
}
}
2. 4个布告板中的代码稍微发生了点变化
[java]
package weatherObservable;
import java.util.Observable;
import java.util.Observer;
/**
* 实现Java内置的观察者接口,布告板不变
* @author wwj
*
*/
public class CurrentConditionDisplay implements Observer, DisplayElement{
Observable observable;
private float temperature;
private float humidity;
public CurrentConditionDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this); //登记为观察者
}
@Override
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
/**
* 在这个方法当中,先确定可观察者属于WeatherData类型,然后利用getter方法获取温度和温度测量值,最后调用display();
*/
@Override
public void update(Observable obs, Object arg) {
if(obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData) obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
}
package weatherObservable;
import java.util.Observable;
import java.util.Observer;
/**