概述
观察者模式定义了对象之间的一对多依赖,使得当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
可以用报纸订阅服务,出版者和订阅者比拟观察者模式。出版者改称为主题,订阅者改称为观察者。
出版者+订阅者=观察者模式
观察者模式实现了一种设计原则:
设计原则
为了交互对象之间的松耦合设计而努力。
观察者模式让主题和观察者之间可以交互,但是不需清楚彼此的细节,是一种松耦合结构。主题只知道观察者实现了某个接口(也就是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设计模式-观察者模式(下)》继续,用观察者模式实现气象站。