定义
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。
现实世界的模型:
比如,某个小镇发生了一起刑事案件,然后有这样的案件处理流程,从地方法庭开始,因为案情的类型、严重程度、社会影响以及案情的发展,可能某个法院无法办理而递交给更高级的法院处理
所以有这样的流程,地方法庭->县法院->市中级人民法院->省高级人民法院->最高人民法院,每一个节点都有能力处理案件。如果每个节点都不处理,最后会在最高院处理
比如,有个公司,有个重大金额的经费审批,有这样的流程,需要一个个审核过去,经理 ->主管->总监->财务
这就构成了一个职责链,经费申请沿着这个链一直过去,如果某个节点发现这个申请不合格,就直接不通过,不会传到下一个节点。如果每个节点都没问题,最后会到财务那里进行最后的处理。所以每个节点都可能把审批处理掉,比如中间节点拒绝掉经费申请,这个申请就终止了。
我们就拿这个企业的重大经费审批流程来举例

职责链模式呢?
目的在于,把每个可以请求的节点封装成一个类,然后把这些节点连接起来构成一个链结构。请求沿着这个职责链传递,直到被处理掉
简单设计
抽象处理者
定义处理请求的接口,持有下一个处理类的引用
具体处理者
实现具体的请求处理,并且判断是否要交给下一个处理类处理
这些处理类构成一个链表,请求沿着链表传递,直到被消费
简单的类图如下:

职责链的好处是,各个节点是松耦合的,可以很方便的排列组合、替换。而具体的职责处理在节点中实现,各个节点独立开来又不会互相干扰
刚开始需求,要求这样处理 A -> B -> C
需求变化,B 的重要性提升,需要提前处理,那么就可以改下连接关系 B -> A -> C
需求变化,有多了一个 D 请求,需要在 A 和 C 之间执行,则 B -> A -> D -> C
...
所以对这个职责链的各个环节的扩展和修改都很方便
同样,请求发送端也和请求处理解耦开来,请求发送者只管发送请求,具体的处理和具体由谁来处理对请求发送者透明
分类
严格职责链
每个节点只干两件事情,一个是承担请求的责任并做相应处理,一个是不处理传给下一个节点。要求请求一定要被处理掉
这种模式比较少见,因为大部分场景,一些节点多多少少会对请求做些处理操作而不是原封不动地交给下一个节点
不严格职责链
不严格职责链,每个节点可以处理请求,并且可以决定请求往下传递或者就此结束
所以每个节点都有可能处理请求,而且请求有可能不被处理
应用实例
OkHttp 的拦截器链
http://www.jianshu.com/p/2acd4a002419
网友评论