观察者设计模式--让你的对象知悉现况

一对一关系
一对多关系
优点:松耦合
使用情景:气象观测站发布天气状况
关注数据:WeatherData追踪目前天气(温度、湿度、气压)
要求:三种布告版(目前状况、气象统计、简单预报),根据 WeatherData实时更新,须考虑扩展性,方便其他开发人员开发新的布告板


观察者设计模式--让你的对象知悉现况_第1张图片
提供数据

情景转换:
1.WeatherData提供获取数据方法
2.数据改变时,measurementsChanged()方法会被调用
3.实现三个布告板,数据改变,即时更新
4.业务扩展,方便增删布告板
实现与问题:


观察者设计模式--让你的对象知悉现况_第2张图片
实现与问题

概念说明:
     出版者+订阅者=观察者设计模式
出版者:"主题"(Subject)
订阅者:"观察者"(Observer)


观察者设计模式--让你的对象知悉现况_第3张图片
观察者模式细节图

关注数据:温度、湿度、气压(设置为WeatherData私有成员变量,并对外提供公共的访问方法)
观察者设计模式--让你的对象知悉现况_第4张图片
WeatherData需要注册观察者方法

观察者设计模式--让你的对象知悉现况_第5张图片
WeatherData需要删除观察者方法

思考:一个类可以既是主题,又是观察者,考虑如何实现?

观察者设计模式定义了对象之间的一对多依赖(主题拥有状态,观察者使用状态,依赖主题告诉他们状态的改变),这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者设计模式--让你的对象知悉现况_第6张图片
一对多关系->集合存储依赖对象

松耦优点说明:
1.主题唯一依赖的是Observer接口列表,因此我们可以随时添加观察者、替代、删除某些观察者
2.新的观察者出现时,主题代码并不需要修改,只需要在Observer接口列表中添加该观察者即可
设计原则:

为了交互对象之间的松耦合设计而努力

观察者设计模式--让你的对象知悉现况_第7张图片
气象站设计->设计

subject指针作为观察者成员属性方便在主题上注册注销

观察者设计模式--让你的对象知悉现况_第8张图片
气象台->实现

思考:更新方法参数种类和个数可能改变,封装的问题?
观察者设计模式--让你的对象知悉现况_第9张图片
WeatherData实现

小技巧:
ArrayList.indexOf()方法获取元素索引判读元素是否存在
ArrayList.contains()实现:indexOf(o) >= 0
观察者设计模式--让你的对象知悉现况_第10张图片
布告板的实现

Observer是观察者与主题之间的协议,DisplayElement是布告板所需、
display()方法可以根据情景调用,构造函数式传入Subject对象引用方便注册和取消注册。


观察者模式之拉数据
  观察者种类繁多,每个观察所关注的数据不尽相同,第一种情况(推数据)中常会出现观察者强迫收到一堆不需要的数据,因为两者之间的update()方法因所需参数的变化扩展性不是很好,因而出现了第二种观察者模式(拉数据)
实现:主题通知观察者数据改变,观察者知道哪个主题数据发生改变,通过主题指针(主题提供状态所需公有的访问方法)自己获取所需的数据。

观察者设计模式--让你的对象知悉现况_第11张图片
Java内置的观察者设计模式(java.util.Observer、java.util.Observable)

可观察者发送通知:
         1.setChanged()
          2.notifyObservers()、notifyObservers(Object arg)
观察者接收通知:
         update(Observable o,Object arg)

推:notifyObservers(arg)->update(Observable o,Object arg)中使用arg
拉:notifyObservers()->update(Observable o,Object arg)中使用o

观察者设计模式--让你的对象知悉现况_第12张图片

setChange()方法好处:更新观察者时有更多弹性,更加适当通知观察者,例如,控制通知的频率,原来1/10度更新一次变为1/2度通知一次
观察者模式拉数据实现
观察者设计模式--让你的对象知悉现况_第13张图片
WeatherData.java

观察者设计模式--让你的对象知悉现况_第14张图片
CurrenConditionsDisplay.java

思考:Observerable中setChange()方法被保护起来了?多态
造成了对多用组合,少用继承设计原则的破坏
总结:

观察者设计模式----在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

观察者设计模式有两种:推数据和拉数据,推数据之间传递推送数据,拉数据传递被观察者指针,从指针获取数据。数据传递、调用方法均使用接口

你可能感兴趣的:(观察者设计模式--让你的对象知悉现况)