设计模式学习--观察者模式(Observer Pattern) (六)

2014-11-24 11:07:15 · 作者: · 浏览: 8
at index is 82.95535
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;


/**