02观察者模式

发布时间 2023-04-12 18:40:47作者: lee_ing

让对象保持消息灵通


需求

一个WeatherData对象负责追踪目前的天气状况(温度,湿度,气压)。希望你们能建立一个应用,有三种布告板,分别显示目前的状况、气象统计及简单的预报。当WeatherObject对象获得最新的测量数据时,三种布告板必须实时更新。而且,这是一个可以扩展的气象站,Weather-O-Rama气象站希望公布一组API,好让其他开发人员可以写出自己的气象布告板,并插入此应用中,我们希望能提供这样的API。

class WeatherData{
        public int getTemperature(){
        }
        public int getHumidity(){
        }
        public int getPressure(){
        }
        public void measurementsChanged(){
        //一旦气象测量更新,此方法会被调用
        }
}

实现1

public class WeatherData {
    // 实例变量声明
    public void measurementsChanged() {
       float temp = getTemperature();
       float humidity = getHumidity();
       float pressure = getPressure();
       currentConditionsDisplay.update(temp, humidity, pressure);
       statisticsDisplay.update(temp, humidity, pressure);
       forecastDisplay.update(temp, humidity, pressure);
    }
// 这里是其他WeatherData方法
}

缺点:

针对实现编程
对于每个新的显示,都得修改这份代码
没有办法在运行时添加/移除显示元素
没有封装改变的部分

观察者模式

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

有几种不同的实现方法,大多数围绕着包括主题和观察者接口的类设计

类图:

第四个设计原则:为了交互对象之间松耦合设计而努力。

主题只知道观察者实现了某个接口(也就是Observer接口)
任何时候我们都可以增加新的观察者。也可以在任何时候删除某些观察者。
有新类型的观察者出现时,主题的代码不需要修改,
独立复用主题和观察者
改变主题/观察者其中一方,不会影响另一方