Chain of Responsibility
(c) 2009 张恂
本文的最新版在《大道至简:实话设计模式》:http://www.zhangxun.com/entry.aspx?sname=GoFpatterns
别名
处理流水线
简述
这是一条任务处理的流水线(或链条)。首先让任务请求的处理者(对象)排成一个队列,然后客户把处理请求递给第一名处理者进行处理或加工,处理完毕后再转交给后继的下一名处理者进行处理,并照此让任务请求沿着这条流水线依次传递下去,直到最后一名处理者收到、处理完该请求。这条流水线上的每名处理者都可能担负着不同的处理职责,故名职责链。结构图
一系列 Worker 排成一条流水线。
图中看上去像根电车“辫子”的 next 关联(后继链)可谓是职责链模式的关键(要害)。如果拿掉这根辫子,我们发现职责链模式就蜕变(缩减)成了一个 Strategy 模式。
现实世界中的例子
实在太多了。1)击鼓传花游戏
2)工厂生产流水线
基本特点
1、实现请求发送者与接收者(处理者)之间的解耦,请求的发送者并不知道最终有哪个或哪些接收者对该请求进行了处理。而请求(对象)本身也不需要知道链的结构。2、请求的可能处理者排成一条链,请求沿着这条链在多个处理者之间进行传递。每个链上的处理者都具有统一的处理请求以及访问到它的后继者的(抽象)接口。
何时采用职责链模式
1、一个请求可能有多个候选的处理者,具体由哪个对象进行处理,需要在运行时自动确定。2、在请求的实际处理者事先不明确的情况下,向一组候选对象中的某一个提交该请求。
3、需要动态指定可处理一个请求的候选对象集合。
典型应用实例
GoF《设计模式》中关于职责链,举的是一个 GUI 中事件传播、与上下文有关的帮助机制的例子。由两个 Widget 类 Button 和 Dialog 以及应用程序类 Application 三种对象组成一个 handleHelp 事件处理链,当用户在 button 上按下 help 按钮时,将调用 button->HandleHelp(),此消息会依次传递给后继的 Dialog 或 Application 对象,从而让用户获得与上下文相关的帮助信息。
在该案例中,作者没有展示后继链如何被动态地改变。
职责链模式在 GUI 用户事件处理中很常见,用户事件(用户点击鼠标或按键盘)沿着一条职责链传播,直到由实际负责的对象、控件对其进行处理或加工。
职责链实例:Web 文本中 UBBCode、XTag 标记的简易处理 (1)
变化点
1、如何实现后继链的建立和使用?2、如何封装被处理的请求对象(the Request object)?
相关模式
职责链常与 Composite 一起使用,请求可沿着对象的组合结构在父子部件之间进行传递。职责链模式是一系列 Strategy 模式(对象)的串联。
在职责链中被处理的请求对象可采用 Command 模式。
下一页
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13633641/viewspace-557939/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13633641/viewspace-557939/