8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer
现实中遇到的问题
当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?
5.1 定义: 观察者模式
观察者模式 Observer
定义对象之间的一对多依赖关系,当一个对象改变状态时,所 有依赖于它的对象都会自动获得通知
Define a one-to-many dependency between objects so that when one object changes state, all
its dependents are notified and updated automatically
5.2 观察者模式案例
观察者模式又叫做发布-订阅(Publish/Subscribe)模式
模型-视图(Model/View)模式
源-监听器(Source/Listener)模式
6.1 Publishers + Subscribers = Observer Pattern
Publisher == Subject 主题
Subscribers == Observers 观察者
主题维护一些数据
观察者对象对主题感兴趣
观察者已经订阅了主题数据,当数据发生变 化之后将会收到更新数据或者更新通知
当主题数据发生变化之后 以某种方式通知观察者
当主题数据发生变化,观察者得到通知
这个Duck对象对主题数据不感兴趣, 当主题数据变化时不会得到通知
6.2 观察者模式定义 Observer Pattern Defined
The Observer Pattern defines a one-to-many dependency between objects so that when one object changes state, all of its dependents
are notified and updated automatically
定义对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对 象都会自动获得通知
6.3 观察者模式架构 Observer Class Diagram

6.5 推模式
推模式是当通知消息来之时,把所有相关信息都通过参数的形 式“推给”观察者
优点:
1.所有信息通过参数传递过来,直接、 简单,观察者可以马上进行处理
2.观察者与被观察者没有一点联系,两 者几乎没有耦合
缺点:
1.所有信息都强迫推给观察者,不管有 用与否
2.如果想添加一个参数,那就需要修改 所有观察者的接口函数
6.6 拉模式
当通知消息来之时,通知的函数不带任何相关的信息,而是要观 察者主动去被主题对象那里去“拉”信息
优点:
1.可以主动去取自己感兴趣的信息
2.如要添加一个参数,无需修改观察者
缺点:
1. 观察者与被观察者有一定的联系
6.7 How to apply 应用 Observer DP
Check list
主题对象只与观察者基类有耦合
The Subject is coupled only to the Observer base class
客户配置观察者的数量与类型
The client configures the number and type of Observers
Observers 首先要知道 Subject,然后把自己注册到 Subject 中
Subject 保存所有注册过的 Observer,当状态发生变化时,广播给所有 注册过的观察者
Subject 可以采用 “push”或者“pull”的方式,与 Observer 交流信息
8.5 GOF设计模式四: 观察者模式Observer的更多相关文章
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- 人人都会设计模式:观察者模式--Observer
https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...
- [设计模式] 19 观察者模式 Observer Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...
- 设计模式九: 观察者模式(Observer Pattern)
简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...
- 设计模式之观察者模式(Observer)(4)
简介 观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上.面向对象设 ...
- c#设计模式之观察者模式(Observer Pattern)
场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...
- JAVA设计模式之观察者模式 - Observer
有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...
- 设计模式之观察者模式(Observer pattern)
最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下: 上课铃声响起,学生A/B/C/D进入教室:下课铃声响起,学生A/B/C/D离开教室. 要求使用设计模式的思想完成铃与学 ...
随机推荐
- 使用 acme.sh 签发续签 Let‘s Encrypt 证书 泛域名证书
1. 安装 acme.sh 安装很简单, 一个命令: curl https://get.acme.sh | sh 并创建 一个 bash 的 alias, 方便你的使用 alias acme.sh=~ ...
- 通过js或jq增加的代码,点击事件或其他一些事件不起作用时
通过js或jq增加的代码,点击事件或其他一些事件不起作用时,可使用 $(document).on("click",".noshow",function() { ...
- 【数据结构】算法 LinkList (Merge Two Sorted Lists)
合并2个有序链表 list A, list B, Solution: 对A,B 表按序读取数据,比较大小后插入新链表C. 由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接 ...
- B/S的学习
一. B/S的概念 B/S(Brower/Server,浏览器/服务器)模式又称B/S结构,是Web兴起后的一种网络结构模式.Web浏览器是客户端最主要的应用软件. 这种模式统一了客户端,将系统功能实 ...
- h5页面实战——与andriod和ios的交互
首先需要我们h5页面需要做一些匹配.比如:如何判断当前手机是andriod还是ios, andriod攻城狮和ios工程师,一般会定义事件的方法.我们套用他们方法就可以了. 那么为什么我要写这个随笔呢 ...
- 运输计划NOIP2015Day2T3
运输计划 题目描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条 航道连通了 L 国的所有星球. 小 P 掌管一 ...
- BeautifulReport 实现app UI自动化测试
修改了 BeautifulReport源码中的一些内容<附:BeautifulReport--适用于unittest自动化测试的可视化报告>; 1.生成截图时,原来的img文件夹必须在项目 ...
- LightGBM算法(转载)
原文:https://blog.csdn.net/niaolianjiulin/article/details/76584785 前者的含义是轻量级,GBM:梯度上升机. 相较于xgboost: 更快 ...
- 湘潭邀请赛+蓝桥国赛总结暨ACM退役总结
湘潭邀请赛已经过去三个星期,蓝桥也在上个星期结束,今天也是时候写一下总结了,这应该也是我的退役总结了~ --------------------------------湘潭邀请赛----------- ...
- CentOS 7离线安装CDH 5.16.1完全指南(含各种错误处理)
安装包下载 1.CM软件包下载 从http://archive.cloudera.com/cm5/redhat/7/x86_64/cm/5.16.1/RPMS/x86_64/下载rpm包,如下: 其实 ...