【Java设计模式】详解系列 3.1.2行为型模式 : 观察者模式 — 模式详解
来源:互联网 发布:sqlserver history 编辑:程序博客网 时间:2024/05/16 19:17
本文相关内容请结合【Java设计模式】详解系列 3.1.1行为型模式 : 观察者模式 — 介绍+实战
认识观察者模式
我们从六大方面理解观察者模式
- 第一 目标与观察者之间的关系
- 第二 单向依赖
- 第三 命名建议
- 第四 触发通知的时机
- 第五 观察者模式的调用顺序示意图
- 第六 通知的顺序
1.目标与观察者之间的关系
根据模式的定义,观察者模式是典型的一对多模式。但是我们要注意:如果观察者只有一个,也是可以的,这样就变相的形成了观察者与对象一对一的关系
同样一个观察者也可以关注多个目标(上一点说的是一个目标对应多个或者一个观察者)
注意:
例如上篇的代码示例中,如果 观察者1 订阅了天气预报的同时,还定义了报纸, 观察者1 就需要接受这两个目标的通知,但是如果天气目标和报纸目标都是使用了update回调方法,就会发生混淆,观察者1 就不知道是谁发送的通知。
简单的解决办法就是不同的观察者 应该为不同的目标 定义 不同的回调方法
2.单向依赖
只有观察者依赖目标而不是目标依赖观察者,二者之间的联系的主动权掌握在目标手中,只有目标知道到什么时候通知观察者。而目标始终是被动的,等待观察者的调用。
3.命名建议
- 目标接口的定义,建议在名称后跟Subject
- 观察者接口的定义,建议在名称后面跟Observer
- 观察者接口的更新方法,建议名称为update
4.触发通知的时机
触发时机主要体现在这段代码中,<1> 与 <2>之间的顺序,应该先改数据再通知(先一<1>后<2>),如果顺序颠倒,就会出现观察者与目标数据不匹配的问题
public void setWeatherContent(String weatherContent) { //<1>设置天气内容 this.weatherContent = weatherContent; //<2>内容有了,说明天气更新了,通知所有的订阅的人 this.notifyObservers(); }
5.观察者模式的调用顺序示意图
主要体现在两个阶段:
1. 准备阶段:
见图
2. 运行阶段:
1. 改变目标对象的状态对应:setWeatherContent
1.1 通知所有注册的观察者对象进行相应的处理对应:notifyObservers
1.1.1回调目标对象,获取相应的数据对应:update
6.通知的顺序
当目标信息改变后,通知观察者时的顺序是不确定,不同的观察者之间的等级是平行的,观察者实现的功能不能依靠目标通知的顺序,因为目标与观察者之间是没有相互依赖关系的。
有待补充
实现的两种方式:推模型和拉模型
利用Java提供的观察者实现
观察者优缺点
何时使用观察者模式
- 【Java设计模式】详解系列 3.1.2行为型模式 : 观察者模式 — 模式详解
- 【Java设计模式】详解系列 3.1.1行为型模式 : 观察者模式 — 介绍+实战
- 详解java设计模式(六)之观察者模式(行为型)
- 设计模式 - 行为型模式 - 观察者模式
- 设计模式->行为型模式->观察者模式
- java设计模式-观察者模式详解
- JAVA设计模式之观察者模式详解
- Java 设计模式之观察者模式的详解(行为模式)
- Java设计模式之行为型模式(观察者模式)
- 设计模式——观察者模式详解
- 详解设计模式——观察者模式
- 设计模式详解——观察者模式
- 设计模式——观察者模式(行为型模式)
- 详解java设计模式(三)之策略模式(行为型)
- 详解java设计模式(四)之迭代器模式(行为型)
- JAVA设计模式详解(一)——观察者模式
- 设计模式-行为-观察者
- 设计模式--行为型--观察者模式
- 运行MIT-GNU Scheme出现“Requested allocation is too large”
- 总结一下自己的2015
- leetcode学习笔记5
- 自定义等高的cell(代码创建frame)
- Fill the Square
- 【Java设计模式】详解系列 3.1.2行为型模式 : 观察者模式 — 模式详解
- shell 中的continue
- HDU 1005.Number Sequence【用递归会超时】(2.5)
- eval解析JSON注意点
- Theano 逻辑回归教程 的注释
- HDU 1247 Hat’s Words
- HTML5开发移动web应用——Sencha Touch篇(8)
- 自定义等高的cell(代码Autolayout)
- Android基础之Fragment2