设计模式-观察者模式

观察者模式

  • 普通的观察者设计模式,一对多的关系。一个主题对应多个对象,对象可以注册,移除,当主题有数据的改变的时候通知对象update。

1.主题接口

public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObserver();
}

主题实现类

public class WeatherData implements Subject {
    private ArrayList observerList;
    private float temp;
    private float humidity;
    private float pressure;

    public WeatherData() {
       observerList = new ArrayList();
    }

    public void measureChanged() {
        notifyObserver();
    }

    //设置数据
    public void setChangedData(float temp, float humidity, float pressure) {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        measureChanged();
    }

    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);
    }

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

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

当前状况观察者

public class CurrentConditionObserver implements Observer, DisPlayElement {

    private Subject weatherData;
    private float temp;
    private float humidity;
    private float pressure;

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

    @Override
    public void display() {
        System.out.println("当前天气状况:" + temp + ":" + humidity + ":" + pressure);
    }

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

统计观察对象。

public class StatisticObserver implements Observer ,DisPlayElement{

    @Override
    public void display() {

    }

    @Override
    public void update(float temp, float humidity, float pressure) {

    }
}

天气预报观察者对象

public class WeatherCastObserver implements Observer ,DisPlayElement{

    @Override
    public void display() {

    }

    @Override
    public void update(float temp, float humidity, float pressure) {

    }
}
  • java内部API支持Observer,可以进行推数据,对象可以进行拉数据,这时候主题应该叫可观察者。

    Observerable ,Observer是java,util包里面的。

public class WeatherData extends Observable {
    private float temp;
    private float humidity;
    private float pressure;

    public WeatherData() {
    }

    public void measureChanged() {
        setChanged();
        notifyObservers();
    }

    //设置数据
    public void setChangedData(float temp, float humidity, float pressure) {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        measureChanged();
    }

    public float getTempData() {
        return temp;
    }

    public float getHumidityData() {
        return humidity;
    }

    public float getPressureData() {
        return pressure;
    }
}

对象显示的接口

public interface DisPlayElement {
    void display();
}

这是观察者对象之一。

public class CurrentConditionObserver implements java.util.Observer, DisPlayElement {

    private Observable observable;
    private float temp;
    private float humidity;
    private float pressure;

    public CurrentConditionObserver(Observable observable) {
        this.observable=observable;
        observable.addObserver(this);
    }

    @Override
    public void display() {
        System.out.println("当前天气状况:" + temp + ":" + humidity + ":" + pressure);
    }

    @Override
    public void update(Observable obs, Object o) {
        if (obs instanceof WeatherData){
            WeatherData weatherData= (WeatherData) obs;
            this.temp = weatherData.getTempData();
            this.humidity = weatherData.getHumidityData();
            this.pressure = weatherData.getPressureData();
        }
        display();
    }
}

这是不变的main方法。

WeatherData weatherData = new WeatherData();
CurrentConditionObserver currentConditionObserver = new CurrentConditionObserver(weatherData);
weatherData.setChangedData(20,30,40.5f);
weatherData.setChangedData(40,90,70.5f);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值