《observer 模式》由会员分享,可在线阅读,更多相关《observer 模式(27页珍藏版)》请在金锄头文库上搜索。
1、OBSERVER 模式,喂!小丽啊! 通知项目组,下午开个项目会议,气象站例子,需求:终端用使用显示设备,显示当前的环境(温度、湿度和气压)、天气统计和简单的预报的三个测量值 从程序上考虑,执行measurementsChanged()方法,目的更新当前环境、天气统计和预报 1、天气数据类里应该有得到三个测量值的getter方法。 2、measurementsChanged()可以被有效的测量数据在任何时候调用。 3、三个测量值因新测量数据改变而改变 4、系统可以被扩充,如下图,Class: WeatherData 通常的实现如下,分析 WeatherData 的缺点 currentCondi
2、tionsDisplay、tatisticsDisplay、forecastDisplay,具体执行方法,我们没法增加和删除其它的显示元素,除非改变程序。 (temp,humidity,pressure),我们可以用通用的接口去告诉显示的元素,他们都有一个update方法传递temp,humidity,pressure值,什么是观查者模式? 报社 + 订阅者 = Observer Pattern 报纸出版社进入商业化,并且开始出版报纸 你订阅了报纸,每次报上都有新的新闻发表给你,只要你保持是一个订阅者,你就一直得到新的新闻。 当你不订阅时,他们就停止向你发表新的新闻 然而报社保持着与其它人订与
3、不订的关系,如下图,Dog、Cat、Mouse都是订阅者(观查者),Subject是出版社(被观查者)。当Subject改变时所有的订阅者都被通知,并且新的值传送你观查者。 Duck不是观查者,因此当Subject数据改变时,它不能得到通知。,Observer的生命周期 (1)Duck请求成为订阅者,Duck成为正式的订阅者,Duck接收数据,Mouse请求取消订阅关系,Mouse消取了订阅者身份,当Subject有变更时,Mouse得不取新的值,Observer Pattern 定义 一个类与一个类集合类一对多的关系,当一个类状态改变时,所有的依赖关系都被自动地改变和通报报社是一个类(被观查
4、者),订阅者是一个集合类(观查者),当报社发布新的报纸时,会分发给每一个订阅者(即通报)。 通俗理解:被观查者有什么变化,观查者立即做出反应,被观查者与观查者是一对多的关系 如下图subject与observers定义了一对多的关系,observers依赖与subject,那么当subject状态改变时,observer就会得到通报,Observer模式的特点: 有力的松散地耦合: Subject只要知道关于实现一种特别的Observer接口,不需要知道具体的observer类做什么,或是别的。 我们能随时增加一个新的observers 我们不需要因为增加新的类型observers修改subj
5、ect 我们能重新使用subject或observers彼此间的依赖 改变subject或observer将不影响彼此,程序实现 一、观查者实现(java.util.Observer)接口,并且调用Observable对象的addObserver()方法,将自已设成观查者身份,也可用删除方法,删除自已。 二、由Observable发送通知 首先继承一个java.util.Observable的超类,然后处理下面两步: (1)先必须调用setChanged()方法,表示在你的对象中状态改变了。 (2)调用两个notifyObservers()方法中的一个,发送通知 三、观查者接收通知 观查者需要实现Observer接口的update方法,接收通知的改变。,气象站类图,设计原则: 作用类间尽力使用松耦合设计,现在你有三类鸭子,野鸭(会飞),饲养鸭(不会飞但会跑),橡皮鸭(不会飞也不会跑) 如果现在你对这三类进行鸭子大叫一声,鸭子们会有什么反映?,