观察者模式定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者模式,怎么感觉那么熟悉~?对,委托机制!
背景
你的团队刚刚赢得一纸合约,负责建立Weather-O-Rama公司的下一代气象站-Internet气象观测站。该气象站必须建立在专利申请的WeatherData对象上,由WeatherData对象负责追踪目前的天气状况(温度、湿度、气压)。要求:建立一个应用,有三种布告板,分别显示目前的状况,气象统计及简单的预报。当WeatherObject对象获得最新的测量数据时,三种布告板必须实时更新。而且,这是一个可以扩展的气象站,Weather-O-Rama气象站希望能有一组API,好让其他开发人员可以写出自己的气象布告板,并插入此应用中。
开工
OK,我们的工作就是根据WeatherData获得数据,并更新三个布告板(目前状况、气象统计和天气预报),看下WeatherData类的设计:
列下清单:
- WeatherData类具有三个get方法,分别得到:温度,湿度和气压
- 当新的测量数据得到后,measurementsChanged()方法被调用,我们不在乎怎么被调用的,我们只要在乎它被调用了
- 我们需要实现三个使用天气数据的布告板,一旦WeatherData有新的测量,立刻更新:"目前状况"布告、"气象统计"布告和"天气预报"布告。
- 此系统必须可以扩展,让其他开发人员建立定制的布告板,用户可以随心所欲地添加或删除任何布告板。目前初始化的布告板有三类:"目前状况"布告,"气象统计"布告和"天气预报"布告(以后万一要增加新的布告呢?)
怎么办?
很简单,我们实现下:
public void meansurementsChanged()
{
//我们只要实现这个方法就OK了 //得到数据 float temp=getTemperature();
float humidity=getHumidity();
float pressure=getPressure();
//调用各自布告板的更新方法 currentConditionsDisplay.update(temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure); }
对吗??回想上一篇文字的内容:
认识观察者模式
这个就是观察者模式:
实现观察者模式的类图不止一种,一般常用的是Subject与Observer接口的类设计,下面,我们定义下观察者模式的类图:
说明:
- 两个接口,主题接口Subject和观察者接口Observer
- 对象使用Subject接口注册为观察者,或者把自己从观察者中删除
- 所有潜在的观察者必须实现Observer接口
- 每个主题都有许多的观察者
- 一个具体主题ConcreteSubject类实现Subject接口
- 具体的观察者ConcretObserver类实现Observer接口,并且必须注册具体的主题
观察者模式,我觉得很好理解的,毕竟我们在用的C#委托机制就是一个观察者模式的原理。
结束
具体实现的代码,我觉得还是看这本书来的清晰,在本章节末尾,还说到"推模式"和"拉模式",所谓"推模式"就是主题对象传递数据,
"拉模式"就是观察者对象主动得数据,很有意思的!我们要牢记一些设计原则:
- 封装变化
- 多用组合,少用继承
- 为交互对象之间的松耦合设计而努力
浙公网安备 33010602011771号