文档章节

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

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
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
编程中的那些套路——关于策略模式

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

gzchen
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Pages Manager——可本地管理Pages服务内容,一键生成漂亮的文档界面。

Pages Manager Git地址 可本地管理Pages服务内容,一键生成漂亮的文档界面。在线预览 简单、轻便,无需安装数据库。 框架:spring-boot 数据库:sqlite 原理 本地维护一组markdown文档 将mar...

tanghc
12分钟前
0
0
基础目标检测算法介绍:CNN、RCNN、Fast RCNN和Faster RCNN

每次丢了东西,我们都希望有一种方法能快速定位出失物。现在,目标检测算法或许能做到。目标检测的用途遍布多个行业,从安防监控,到智慧城市中的实时交通监测。简单来说,这些技术背后都是强...

AI女神
13分钟前
0
0
哪有什么互联网寒冬?只是你穿的少而已!

声明:本文由终端研发部原创发布,未经允许,不得转载 前言 最近一段时间,大家都在说一些大公司纷纷裁员, 优化公司内部的组织架构。面对如此的寒冬变化,很多人在迷茫,在焦虑,在担忧自己...

终端研发部
18分钟前
0
0
nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory)

Nginx 启动时报错:nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory) 原因:系统重启 /var/run/ 目录下文件会清空。 方法一: # sudo nginx -c /etc/ngi......

驛路梨花醉美
20分钟前
1
0
TiDB 源码阅读系列文章(二十四)TiDB Binlog 源码解析

作者:姚维 TiDB Binlog Overview 这篇文章不是讲 TiDB Binlog 组件的源码,而是讲 TiDB 在执行 DML/DDL 语句过程中,如何将 Binlog 数据 发送给 TiDB Binlog 集群的 Pump 组件。目前 TiDB 在...

TiDB
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部