1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者
按照上面的分析我们来进行设计
1.抽象主题Subject
public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers(); }
2.抽象观察者Obsever
public interface Observer {public void update(float temp, float humidity, float pressure); }
3.具体主题WeatherData
public class WeatherData implements Subject {private ArrayList observers;//temperature、humidity、pressure就是WeatherData的“状态”private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {int i = observers.indexOf(o);if (i >= 0) {observers.remove(i);}}public void notifyObservers() {for (int i = 0; i < observers.size(); i++) {Observer observer = (Observer)observers.get(i);observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {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;} }
主题:相当的经典,第一具体的主题和多个观察者的集合,当自己的天气发送变化的时候,调用观察者的
observer.update(temperature, humidity, pressure)通过观察者,观察者就能够通过
update函数获得最新的天气变化
具体的主题还必须提供一个接口,让观察者注册进来 registerObserver(Observer o)这个设计模式相当的经典
5.具体观察者
public class StatisticsDisplay implements Observer, DisplayElement {private float maxTemp = 0.0f;private float minTemp = 200;private float tempSum= 0.0f;private int numReadings;//记录观测的次数以便计算平均温度值private Subject weatherData;public StatisticsDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}//这属于“推”数据,本类只使用到了第一个参数public void update(float temp, float humidity, float pressure) {tempSum += temp;numReadings++;if (temp > maxTemp) {maxTemp = temp;}if (temp < minTemp) {minTemp = temp;}display();}public void display() {System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings)+ "/" + maxTemp + "/" + minTemp);} }
具体的观察者在收到最新的主题变化的信息之后,就可以依据最新的信息做自己想要做的事情,例如求气温的平均值等