设计模式-14-观察者模式

来源:互联网 发布:刘氏哈蜜椴树白蜜 知乎 编辑:程序博客网 时间:2024/05/24 04:37

观察者模式:观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。


被观察者接口

package com.actionPattern.observer.edition1;//被观察者接口public interface Subject {    /**     * 注册观察者     * @param observer     */    public void registerObserver(Observer observer);    /**     * 删除观察者     * @param observer     */    public void removeOberver(Observer observer);    /**     * 当主题状态发生改变时,这个方法需要被调用,以通知所有观察者     */    public void notifyObserver();}

实际被观察者(通过创建一个观察者集合,在被观察者发生改变时,遍历集合通知所有的观察者发生改变)

package com.actionPattern.observer.edition1;import java.util.ArrayList;import java.util.List;// 实际被观察者public class WeatherData implements Subject{    private List<Observer> observers;//观察者集合,实现一对多    private float tempterature;//温度    private float pressure;//压力    private float humidity;//湿度    public WeatherData(){        observers = new ArrayList<Observer>();    }    //通过遍历集合通知所有的被观察者发生改变    @Override    public void notifyObserver() {        System.out.println("总共有观察者数:"+observers.size()+",所以有"+observers.size()+"个对象调用display方法");        for(int i = 0; i < observers.size();i++){            Observer observer = observers.get(i);            observer.update(tempterature, humidity, pressure);        }    }    @Override    public void registerObserver(Observer observer) {        observers.add(observer);    }    @Override    public void removeOberver(Observer observer) {        int i = observers.indexOf(observer);        if(i >= 0){            observers.remove(i);        }    }    /**     * 气象站得到更新的观测数据时,通知观察者     */    public void measurementChanged(){        notifyObserver();    }    public void setMeasurements(float temperature,float humidity,float pressure){        this.tempterature = temperature;        this.humidity = humidity;        this.pressure = pressure;        measurementChanged();    }}

观察者接口

package com.actionPattern.observer.edition1;//观察者接口public interface Observer {     public void update(float temp,float humidity,float pressure);     public void display();}

实际观察者

package com.actionPattern.observer.edition1;//观察者public class CurrentConditionsDisplay implements Observer{    private float temperature;    private float humidity;    private    Subject weatherData;    public CurrentConditionsDisplay(Subject weatherData){        this.weatherData = weatherData;        weatherData.registerObserver(this);      //注册观察者    }    public void update(float temp, float humidity, float pressure) {        this.temperature = temp;        this.humidity = humidity;        display();    }    @Override    public void display() {        System.out.println("Current conditions:"+temperature+"F degrees and "+humidity+"% humidity");    }}

测试

package com.actionPattern.observer.edition1;public class WeatherStation {    public static void main(String[] args) {        WeatherData weatherData = new WeatherData();        //一个被观察者(weatherData)对象对应多个观察者对象(conditionsDisplay,conditionsDisplay2)        CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData);        CurrentConditionsDisplay conditionsDisplay2  =  new CurrentConditionsDisplay(weatherData);        //当被观察者发生变化的时候,多个观察者相应的调用display()方法,发生相应的变化        weatherData.setMeasurements(80, 65, 30.4f);    }}
原创粉丝点击