观察者定义了对象之间一对多的关系
主体(也就是可观察者)用一个共同的接口来更新观察者
观察者和可观察者之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口
你的团队刚刚赢的一纸合约,负责建立Weather-O-Rama公司的下一代气象站--Internet气象观测站
此系统的三个部分是气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看);
目前我们知道什么呢?
1、WeatherData类具有getter方法,可以获取三个测量值:温度、湿度与气压
2、当新的测量数据备妥时,measurementsChanged()方法就会被调用(我们不在乎此方法时如何被调用的,我们只在乎它被调用了)
3、需要实现三个布告板:“目前状况”、“气象统计”、“天气预报”布告。一有WeatherData更新数据,这些布告必须马上更新
4、此系统必须可扩展
简单实现上面实现存在的问题?
1、针对具提实现编程,会导致以后在增加或删除布告板时必须修改程序
2、改变的地方,没有封装起来(上面.update方法的调用)
3、.update方法,看起来像是一个统一的接口;没有实现一个共同的接口
现在来看看观察者模式
出版者+订阅者=观察者模式
如果了解报纸订阅是怎么回事,其实就知道观察者模式怎么回事,这是名词不太一样:
出版者改称为“主题“Subject,订阅者改称为”观察者“Observer
来更仔细的了解一点:
主题对象:主题对象管理某些数据;当主题内的数据改变,就会通知观察者,一旦数据改变,新的数据就会以某种形式送到观察者手上
观察者:观察者已经订阅(注册)主题以便在主题数据改变时能够收到更新
定义观察者模式
观察者模式定义了对象之间一对多以来,这样以来党一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
主题和观察者定义了一对多的关系。观察者依赖与此主题,只要主题状态一有变化,观察者就会被通知。
问:观察者和一对多的关系有何关联?
答:利用观察者模式,主题是有状态的对象,并且可以控制这些状态。另一方面,观察者使用这些状态,虽然这些状态不属于他们。有许多的观察者,依赖主题来告诉他们状态何时改变了。这就产生一个关系:“一个”主题对“多个”观察者的关系
问:期间的依赖如何产生的?
答:因为主题是真正拥有数据的人,观察者是主题的依赖者,在数据变化时更新。这样比起让许多对象控制同一份数据来,可以得到更干净的OO设计
松耦合的威力
当两个对象之间松耦合,他们依然可以交互,但是不太清楚彼此的细节
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。
观察者模式,类图如下:
观察者模式观察者模式代码实现:
接口类 weatherData类 具体观察者 测试类总结:
OO基础:
封装、继承、多态、抽象
OO原则:
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间的松耦合设计而努力
网友评论