标签:server 主题 eth ever temp min 平均值 参数 nbsp
1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者
按照上面的分析我们来进行设计
public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }
public interface Observer { public void update(float temp, float humidity, float pressure); }
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)这个设计模式相当的经典
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); } }
具体的观察者在收到最新的主题变化的信息之后,就可以依据最新的信息做自己想要做的事情,例如求气温的平均值等
观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现
标签:server 主题 eth ever temp min 平均值 参数 nbsp
原文地址:http://www.cnblogs.com/kebibuluan/p/7738864.html