HeadFirst设计模式-观察者模式(上)

概述

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

可以用报纸订阅服务,出版者和订阅者比拟观察者模式。出版者改称为主题,订阅者改称为观察者。

出版者+订阅者=观察者模式

观察者模式实现了一种设计原则:

设计原则

为了交互对象之间的松耦合设计而努力。

观察者模式让主题和观察者之间可以交互,但是不需清楚彼此的细节,是一种松耦合结构。主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其它任何细节。

一个具体例子,气象检测应用

假设你需要做一个气象检测应用,气象站提供了WeatherData对象接口,可从中获取到湿度、温度、气压的实时数据,你的工作就是将这些数据更新到三个布告板中显示。三个布告板分别是目前状况、气象统计和天气预报。

WeatherData类的结构

getTemperature();
getHumidity();
getPressure();
// 一旦气象测量更新,此方法会被调用
measurementsChanged();

先看一个错误实现

根据WeatherData类的说明,直接measurementsChanged()方法中添加我们的布告板更新代码:

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);
    }
}

这个实现存在几个问题:

1、对于每个新的布告板,都得修改代码。

2、无法在运行时动态地增加或删除布告板。

3、针对具体实现编程,而没有去针对接口编程。

4、没有封装经常改变的部分。

下篇《HeadFirst设计模式-观察者模式(下)》继续,用观察者模式实现气象站。

上一篇:koa-router 路由


下一篇:推荐一款基于nodejs+koa+vue开发的开源智慧物业系统