设计模式(十九)观察者模式 Observer

Posted jing-an-feng-shao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式(十九)观察者模式 Observer相关的知识,希望对你有一定的参考价值。

  • 模拟场景:

  甲方提供了一个气象站的接口,气象站上面装有:温度感应装置、湿度感应装置、气压感应装置。

  现在我们是乙方,需要设计一个 WeatherData 对象,从气象站获取数据,并且利用这些数据,更新三个布告板(当前状况、气象统计、天气预报)。

 

  • 第一版解决方案:

  通过简单地分析,我们可以很快确定一套解决方案:

  WeatherData 提供一个 measurementsChanged() 方法,当这个方法被调用了,去实时获取气象站的数据,然后更新到三个布告板上。

public class BadWeatherData 

    @Getter
    private float temperature;
    @Getter
    private float humidity;
    @Getter
    private float pressure;

    private CurrentConditionsDisplay currentConditionDisplay;
    private StatisticsDisplay statisticsDisplay;
    private ForecastDisplay forecastDisplay;

    public BadWeatherData() 
        // some initialized function for displays
    

    // We don‘t care how it be called, we only know is when it is called, we will update displays.
    public void measurementsChanged() 
        // We don‘t care how it gets data
        float temperature = getTemperature();
        float humidity = getHumidity();
        float pressure = getPressure();

        currentConditionDisplay.update(temperature, humidity, pressure);
        statisticsDisplay.update(temperature, humidity, pressure);
        forecastDisplay.update(temperature, humidity, pressure);
    

 

  • 第一套方案有什么问题?

  显然,这是一个扩展性很差的解决方案,它有如下问题:

  1. 没有针对接口编程。(Display 应该事先一个公共的接口)
  2. 如果需要增加或者删除 Display,都要修改代码。
  3. 不能动态地增加或者删除 Display。

 

  • 观察者模式:

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

 

以上是关于设计模式(十九)观察者模式 Observer的主要内容,如果未能解决你的问题,请参考以下文章

设计模式Observer 观察者模式浅析

[Android&Java]浅谈设计模式-代码篇:观察者模式Observer

观察者模式(Observer Pattern)

设计模式之- 观察者模式(Observer Pattern)

JDK自带的Observable和Observer实现观察者模式

JAVA观察者模式(observer pattern)