设计模式:观察者模式

  观察者模式:在对象之间定义一对多的依赖,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

  在定义一对多的时候,我们把一称做主题,多称做观察者。下面我们直接看代码来简单了解观察者模式。

  第一步:先创建一个主题接口,对象使用此接口来新增、删除、通知观察者。

//主题接口,用于添加、删除和通知观察者
public interface Subject {
    //添加观察者
    public void registerObserver(Observer o);
    //删除观察者
    public void removeObserver(Observer o);
    //通知所有观察者
    public void notifyObservers();
}

  第二步:创建一实现主题接口的实体类。其中temperature、humidity、pressure为主题通知给观察者的数据。

//实现主题接口
public class WeatherData implements Subject{
    private ArrayList observers;
    private float temperature;
    private float humidity;
    private float pressure;
    
    public WeatherData(){
        observers = new ArrayList();
    }

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

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

    @Override
    public void notifyObservers() {
        for(int i =0; i<observers.size(); i++){
            Observer o = (Observer)observers.get(i);
            o.update(temperature, humidity, pressure);
        }
    }
    
    public void  measurementsChange(){
        notifyObservers();
    }
    
    public void setMeasurements(float temperature, float humidity,float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChange();
    }
}

  第三步:创建一个观察者接口,并有一个update方法告诉观察者,当主题改变时调用。

//观察者的需实现的接口,表明是观察者身份
public interface Observer {
    public void update(float temperature, float humidity,float pressure);
}

  第四步:创建两个观察者,并实现观察者接口。

//创建一个观察者CurrentConditionsDisplay
public class CurrentConditionsDisplay implements Observer{

    private float temperature;
    private float humidity;
    private float pressure;
    private Subject weatherData;
    
    public CurrentConditionsDisplay(Subject weatherData){
        this.weatherData = weatherData;
        //在主题中加入此观察者
        weatherData.registerObserver(this);
    }
    
    @Override
    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        System.out.println("观察者CurrentConditionsDisplay得到了数据:" + temperature +"," + humidity +"," + pressure);
    }
}
//创建另一个观察者StatisticsDisplay
public class StatisticsDisplay implements Observer{
    private float temperature;
    private float humidity;
    private float pressure;
    private Subject weatherData;
    
    public StatisticsDisplay(Subject weatherData){
        this.weatherData = weatherData;
        //在主题中加入此观察者
        weatherData.registerObserver(this);
    }
    
    @Override
    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        System.out.println("观察者StatisticsDisplay得到了数据:" + temperature +"," + humidity +"," + pressure);
    }
}

  第五步:测试

public class Test {
    public static void main(String[] args) {
        WeatherData  weatherData = new WeatherData();
        CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData);
        StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
        weatherData.setMeasurements(1.0f,2.0f,3.0f);
    }
}

  运行结果:

     

  好了,这就是一个简单的观察者模式了,其实在Java中,有内置的观察者模式,主要利用java.util.Observer和java.util.Observable,具体这里不讲解了,都很类似。

  

  下一节:装饰者模式

作者:哀&RT
出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/Tony-Anne/p/6498091.html