IBin 'S Space

勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日所有亏~
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

Head First设计模式笔记之(观察者模式)

Posted on 2008-03-23 17:55  ibin  阅读(1073)  评论(0)    收藏  举报

观察者模式定义

     定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者模式,怎么感觉那么熟悉~?对,委托机制!

背景

      你的团队刚刚赢得一纸合约,负责建立Weather-O-Rama公司的下一代气象站-Internet气象观测站。该气象站必须建立在专利申请的WeatherData对象上,由WeatherData对象负责追踪目前的天气状况(温度、湿度、气压)。要求:建立一个应用,有三种布告板,分别显示目前的状况,气象统计及简单的预报。当WeatherObject对象获得最新的测量数据时,三种布告板必须实时更新。而且,这是一个可以扩展的气象站,Weather-O-Rama气象站希望能有一组API,好让其他开发人员可以写出自己的气象布告板,并插入此应用中。

开工

     OK,我们的工作就是根据WeatherData获得数据,并更新三个布告板(目前状况、气象统计和天气预报),看下WeatherData类的设计:

20.jpg

列下清单:

  • 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); }
对吗??回想上一篇文字的内容:
21 

认识观察者模式
   这个就是观察者模式:
22 
实现观察者模式的类图不止一种,一般常用的是Subject与Observer接口的类设计,下面,我们定义下观察者模式的类图:
23  
说明:
  • 两个接口,主题接口Subject和观察者接口Observer
  • 对象使用Subject接口注册为观察者,或者把自己从观察者中删除
  • 所有潜在的观察者必须实现Observer接口
  • 每个主题都有许多的观察者
  • 一个具体主题ConcreteSubject类实现Subject接口
  • 具体的观察者ConcretObserver类实现Observer接口,并且必须注册具体的主题

观察者模式,我觉得很好理解的,毕竟我们在用的C#委托机制就是一个观察者模式的原理

结束 
 具体实现的代码,我觉得还是看这本书来的清晰,在本章节末尾,还说到"推模式"和"拉模式",所谓"推模式"就是主题对象传递数据,
"拉模式"就是观察者对象主动得数据,很有意思的!我们要牢记一些设计原则:
  • 封装变化
  • 多用组合,少用继承
  • 为交互对象之间的松耦合设计而努力
 

PS:

MSN:ibin@live.com,欢迎一起交流