观察者模式

来源:互联网 发布:淘宝店主贷款 编辑:程序博客网 时间:2024/06/05 07:55

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);    }}
0 0
原创粉丝点击