1. 程式人生 > >觀察者模式(Observer Pattern)(二):HeadFirst中的氣象站的實現

觀察者模式(Observer Pattern)(二):HeadFirst中的氣象站的實現

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, 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);
    }
}

具體的觀察者在收到最新的主題變化的信息之後,就可以依據最新的信息做自己想要做的事情,例如求氣溫的平均值等



觀察者模式(Observer Pattern)(二):HeadFirst中的氣象站的實現