美文网首页设计模式
观察者设计模式--让你的对象知悉现况

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

作者: 柿籽 | 来源:发表于2018-02-16 13:50 被阅读0次

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


提供数据

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


实现与问题

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


观察者模式细节图
关注数据:温度、湿度、气压(设置为WeatherData私有成员变量,并对外提供公共的访问方法)
WeatherData需要注册观察者方法
WeatherData需要删除观察者方法
思考:一个类可以既是主题,又是观察者,考虑如何实现?

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

一对多关系->集合存储依赖对象

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

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

气象站设计->设计

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

气象台->实现
思考:更新方法参数种类和个数可能改变,封装的问题?
WeatherData实现
小技巧:
ArrayList.indexOf()方法获取元素索引判读元素是否存在
ArrayList.contains()实现:indexOf(o) >= 0
布告板的实现
Observer是观察者与主题之间的协议,DisplayElement是布告板所需、
display()方法可以根据情景调用,构造函数式传入Subject对象引用方便注册和取消注册。

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

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


setChange()方法好处:更新观察者时有更多弹性,更加适当通知观察者,例如,控制通知的频率,原来1/10度更新一次变为1/2度通知一次
观察者模式拉数据实现
WeatherData.java
CurrenConditionsDisplay.java
思考:Observerable中setChange()方法被保护起来了?多态
造成了对多用组合,少用继承设计原则的破坏
总结:

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

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

相关文章

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

    一对一关系一对多关系优点:松耦合使用情景:气象观测站发布天气状况关注数据:WeatherData追踪目前天气(温度...

  • 设计模式之观察者模式

    这个模式可以帮对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知,有了观察者模式,消息...

  • 观察者模式

    让你的对象知悉现状:观察者模式   这是《Head First设计模式(中文版)》第二章的读书笔记。   这一章讲...

  • 面試小記

    1:设计模式 观察者模式observer observerble,subscribe (订阅) (1)观察者对象 ...

  • 1.2:让你的对象知悉现状:观察者模式

    1:有趣的事情发生时,千万别错过了! JDK中使用最多的模式之一,非常有用。 2:观察者模式 3:设计原则 (1)...

  • 观察者模式(Observer Pattern)——让你的对象知悉

    概述 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。...

  • Android中的设计模式之观察者模式

    参考 《设计模式:可复用面向对象软件的基础 》5.7 Observer 观察者 对象行为型模式 《设计模式解析》 ...

  • 五、JavaScript 观察者模式

    观察者模式 观察者模式是这样一种设计模式。一个被称作被观察者的对象,维护一组被称为观察者的对象,这些对象依赖于被观...

  • Head_First设计模式(二)----观察者模式

    简述设计模式 观察者模式: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态...

  • 设计模式之 观察者模式

    观察者模式 概述 UML类图 代码栗子 总结 概念 概念 观察者模式又叫做发布-订阅模式,观察者设计模式定义了对象...

网友评论

    本文标题:观察者设计模式--让你的对象知悉现况

    本文链接:https://www.haomeiwen.com/subject/szfutftx.html