觀察者模式(Observer Pattern)(二):HeadFirst中的氣象站的實現
阿新 • • 發佈:2017-10-26
att dex mov min first return 狀態 size sdi
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, floathumidity, 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); } }
具體的觀察者在收到最新的主題變化的信息之後,就可以依據最新的信息做自己想要做的事情,例如求氣溫的平均值等
觀察者模式(Observer Pattern)(二):HeadFirst中的氣象站的實現