码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-06-03 17:14:10      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:float   play   不能   fun   tis   它的   接口编程   解决   private   

  • 模拟场景:

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

  现在我们是乙方,需要设计一个 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

标签:float   play   不能   fun   tis   它的   接口编程   解决   private   

原文地址:https://www.cnblogs.com/jing-an-feng-shao/p/10968609.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!