文档章节

小菜学设计模式——观察者模式

learn_more
 learn_more
发布于 2015/06/12 22:57
字数 814
阅读 173
收藏 4

背景   

    上一次去看电影院看电影,半旁边的妹子说只要扫一扫就能免费领取爆米花一份,你说我怎么躲得过妹子的招数呢?所以拿起我的手机,扫一扫,注册会员,ok 领取爆米花。时间过去了,我发现我的手机怎么老是收到一些乱七八糟的信息,一旦有什么大小事我都会收到信息,你可知道我是拒绝的。恩,这里就说说,观察者模式,因为我的手机号码已经成为他们发消息的接收者,或说监听器、或说观察者。


1、使用意图   

    当一个对象改变的同时需要改变其他对象时,观察者模式似乎很受用。


2、生活实例   

    饭点一到,所有同事包括我立刻放下手中的活,有看NBA的、有睡觉的,有直接去食堂排队等饭吃的。似乎这里少了一个通知的过程,呵呵,不要紧。

3、Java 例子(框架、JDK 、JEE)

    因为观察者的本质就是监听器,所以使用监听器最多的当然是Swing或AWT,比如一个按钮被点击会触发click事件,鼠标移动会触发mouseover事件等,事件触发,就会通知对应观察者(监听器)

4、模式类图    

  1. 抽象主题角色(Subject):定义一个接口,声明作为主题角色应该具备的方法(对观察者对象的增删改之类的方法声明)。

  2. 主题角色(Concrete Subject):实现了抽象主题角色,实现了它的所有方法,并且含有一个抽象观察者角色的集合引用作为成员变量,也就是说一个主题角色可以拥有多个观察者。

  3. 抽象观察者角色(Observer):定义了一个接口,声明最为观察者角色应该具备的方法(这个方法是当观察者收到通知后做出的反应,一般就是update)。

  4. 具体观察者角色(Concrete Observer):实现抽象观察者角色,主要是实现接口中的update方法。


5、模式优点

  观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,是他们能够自动更新自己。(也叫做 发布-订阅模式)    观察者所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。


6、与类似模式比较

  观察者模式是我们最常使用的设计模式之一,尤其是jQuery前端时,对于事件的注册都是观察者模式的一个淋漓尽致的体现。    观察者和其他模式的比较,感觉差距很大。




© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 92
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
编程中的那些套路——关于工厂模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 前面我们写了简单工厂模式,《编程中的那些套路——关于简单工厂模式》,但简单工厂模式有一些不足(违反...

gzchen
08/27
0
0
编程中的那些套路——关于单例模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 在设计模式中,单例模式和工厂模式)可以说是使用的最普遍的设计模式了,所以掌握此种模式尤为重要。 单...

gzchen
08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

babel6升级到7,jest-babel报错:Requires Babel "^7.0.0-0", but was loaded with "6.26.3".

自从将前端环境更新到babel7,jest-babel之前是基于babel6的,执行时候就会报:Requires Babel "^7.0.0-0", but was loaded with "6.26.3". 很烦,因为连续帮好几台电脑修复这个问题,所以记...

曾建凯
25分钟前
1
0
探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0
深入理解Plasma(四):Plasma Cash

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章主要介绍在 Plasma 框架下的项目 Plasma Cash。 深入理解Plasma(1):...

HiBlock
昨天
1
0
命令参数的三大风格:Posix、BSD、GNU

今天读到命令行中参数的风格有三大类,即Unix/Posix、BSD、GNU。分别有以下特征: Unix/Posix风格,即命令后的参数,可以分组,便必须以连字符开头,如ps -aux。 BSD风格,即命令后的参数,可...

大别阿郎
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部