Head First设计模式之观察者模式

观察者模式:又称作发布-订阅模式。当发布者的数据发生变化时,需要把变化通知到每个订阅者。类似于报纸的订阅,报社就是发布者,读者就是订阅者。
 

需求分析:

气象站采集的数据用于三个公告板进行展示,请设计这样的系统,完成我们想要的功能:当气象数据发生变化时,立即通知三个公告板更新数据。我们这里的气象站就是发布者,三个公告板就是订阅者。

 

设计思路:
 

1. 设计一个气象站类,里面存储各种气象数据。

2. 设计不同的公告板用于显示数据,设计统一的数据更新方法,用于更新数据显示。

3. 在气象站类提供订阅者管理的方法,存储所有订阅者的对象实例,当数据发生变化时,发布者将数据挨个通知到订阅者,并提供取消订阅的方法。

 

代码实现:
 

1.定义发布者
 

//继承Observable
public class WeatherData extends Observable{
    
    //数据
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData(){
    }
    
    //数据发生变化,进行通知
    public void measurementsChanged(){
        setChanged();
        notifyObservers();
    }
    
    //产生数据变化
    public void setMeasurements(float temperature, float humidity, float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }
    
    //用于观察者的随意pull数据

    public float getTemperature(){
        return this.temperature;
    }

    public float getHumidity(){
        return this.humidity;
    }

    public float getPressure(){
        return this.pressure;
    }
}

2.定义订阅者 

public class CurrentConditionDisplay implements Observer, DisplayElement{
    
    Observable observable;
    private float temperature;
    private float humidity;

    public CurrentConditionDisplay(Observable observable){
        this.observable = observable;
        //添加观察者
        observable.addObserver(this);
    }

    public void update(Observable obs, Object arg){
        if(obs instanceof WeatherData){
            WeatherData weatherData = (WeatherData)obs;
            //主动pull数据
            this.temperature = weatherData.getTemperature();
            this.humidity = weatherData.getHumidity();
            display();
        }
    }
}

 

优点:

1. 数据发生变化,直接通知到订阅者。

2. 自动pull的方法提供了灵活性。

你可能感兴趣的:(Head,First,设计模式)