觀察者模式

Demo場景:終端通過WeatherData實時顯示(獲取)變化的數據。

(1)主題接口:Subject

package designpattern.observer.v1;

/**
 * 主題接口
 */
public interface Subject {

    public void registerObserver(Observer o);

    public void removeObserver(Observer o);

    public void notifyObservers();
}

(2)主題接口實現類:WeatherData

package designpattern.observer.v1;

import java.util.ArrayList;

public class WeatherData implements Subject {

    private ArrayList<Observer> observers;
    private float temprature;
    private float humidity;
    private float pressure;

    public WeatherData(){
        observers = new ArrayList<Observer>();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        int i = observers.indexOf(observer);
        if(i>0){
            observers.remove(observer);
        }
    }

    @Override
    public void notifyObservers() {
        for(int i=0; i<observers.size(); i++){
            Observer observer = observers.get(i);
            observer.update(temprature, humidity, pressure);
        }
    }

    //檢測到變化時,通知觀察者
    public void measurementsChanged(){
        notifyObservers();
    }

    public void setMeasurements(float temprature, float humidity, float pressure){
        this.temprature = temprature;
        this.humidity = humidity;
        this.pressure = pressure;

        measurementsChanged();
    }

}

(3)觀察者接口:Observer

package designpattern.observer.v1;

/**
 * 定義觀察者接口
 */
public interface Observer {

    public void update(float temp, float humidity, float pressure);
}

(4)觀察者play行爲接口:DisplayElement

package designpattern.observer.v1;

/**
 *  定義顯示這個行爲的接口
 */
public interface DisplayElement {

    public void display();
}

(5)觀察者接口、行爲接口實現類:CurrentConditionsDisplay

package designpattern.observer.v1;

public class CurrentConditionsDisplay implements Observer, DisplayElement {

    private float temprature;
    private float humidity;
    private Subject weatherData;

    public CurrentConditionsDisplay(Subject weatherData){
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }

    @Override
    public void display() {
        System.out.println("Current Conditions:" + temprature + "C degrees and " + humidity + "% humidity");
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        this.temprature = temp;
        this.humidity = humidity;
        display();
    }

}

演示觀察者模式

package designpattern.observer.v1;

public class WeatherStation {

    public static void main(String[] args) {
        //實例化一個主題
        WeatherData weatherData = new WeatherData();

        CurrentConditionsDisplay currentCondDisplay = new CurrentConditionsDisplay(weatherData); 

        weatherData.setMeasurements(10, 20, 30.4f);
        weatherData.setMeasurements(11, 19, 35.6f);
        weatherData.setMeasurements(15, 30, 40.4f);

    }
}
發佈了44 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章