文档章节

设计模式之 明确责任 观察者模式 状态模式 责任链模式

backbye
 backbye
发布于 09/26 20:09
字数 922
阅读 13
收藏 0

观察者模式是任务分发的一种模式。

如果认为我们设计的系统的各个模块(或子系统)的最终目的是完成共同任务,那么这个任务如何分配到多个模块的就是我们遇到的第一个问题。简单设计场合我们不会遇到这个问题,因为我们可以很清晰的划分责任,安排好逻辑,这是一种中心管控的办法,而且是隐式的,因为程序员自己承当了分配职责的单元。

当情况变得复杂的时候,我们首先想到的也是中心管控,不过这时候我们采取的是显式的构造一个管理者,它具有管控执行、分配职责的能力。第一个模式叫做状态模式(State),如果系统的状态可以很好的定义,那么可以根据当前状态指定执行模块;这是很容易想到的任务分发机制。但是有时候状态并非那么容易定义或者管理者并不清楚任务该交给谁,但是我们希望它能起到调度的作用,不如发出暂停的指令,维持一个任务栈等待,这就需要观察者模式,因为它不再直接分配职责,所以我们叫它观察者。

换一个更容易理解的名字,它叫做 发布/订阅 模式。观察者维持一个任务栈,而子模块通过订阅操作连接到这个任务栈,从订阅栈中取任务、完成、再取任务。

很显然,观察者模式的实质是状态同步,或者称为同步或者通信。它使得任务从分发变成了领取,观察者甚至不需要知道自己需要监督执行者,它只做全局管控;这是很好的解耦。但是同步或通信带来新的开销和复杂度。

责任链模式 是去中心的责任分发模式。和观察者模式很象,但是它不再需要那个所谓发布者,责任是在一个链条上传递,也就免去了通信的复杂度。打个比方,一个武林高手想去挑战少林寺方丈,首先要过看门人那一关,然后是一群小徒弟,然后是教拳师傅,然后是各个高僧,最后才轮到方丈,这就是一个责任链,职责自然而然的在上面传递。

好处很多,去中心化,设计简单,容易扩展和兼容。但是限制也很现实,首先链条如果太长会损失性能,如果不能明确职责,那么输出的有效性不能保证,比如上面武林高手那个例子,看门人不知天高地厚直接应战然后战死,导致消息不能传到院内,那么他就白死了。我们的系统遇到责任链一个有效输出的时候就会认为这个任务已经结束,所以如果链条上的每个环节不能确定是否是自己能处理的职责,就会出错。

© 著作权归作者所有

共有 人打赏支持
backbye
粉丝 0
博文 14
码字总数 8175
作品 0
武汉
QA/测试工程师
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
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设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
Tomcat 系统架构与设计模式_ 设计模式分析

门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到...

lvzjane
2014/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
10
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
13
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
18
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
11
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部