bigtalk.jpg

第24章 加薪非要老总批?——职责链模式

概念

使多个对象都有处理请求的机会,从而避免发送者和接收者的耦合关系。将对象连成一条链,并沿着此链传递请求,直至有一个对象处理它为止。比如:考勤处理。

没有设计模式的时候,一切都在分支中进行,在分支中判断条件,以及谁来处理,但是采用这个模式,将不同职责封装成一个对象,每个对象有一个它不能处理时的后继者(将责任转给后继者),直至有一个能处理的。这样降低了复杂和耦合度。

实现

  • Handler: 处理请求者的抽象类,包括:后继者(当前对象不能处理请求时,转给这个后继者处理),设置后继者的接口,处理接口,
  • ConcreteHandlerx: 具体处理请求的类,创建时设置其后继者(比如:考勤处理中的上级),并实现处理接口(处理请求,处理不了就调用后继者的这个接口)。
  • Client: 创建各个具体请求类,设置其后继者,然后发送请求给其中之一,请求会沿着处理者的链直至到达处理为止。

类图实现:

23_responsibility.png

客户端使用:


23_responsibility_use.png

特点

客户端发送的请求一定会被处理不必关心被谁处理,客户端可以设置处理者的结构增加不同场景灵活性;处理者不必关心整个处理流程只需知道自己职责以及无法执行时的后继者,这样增加角色也容易修改不用影响全部。将分支通过职责链的方式,分解到每个处理对象中,实现了解耦(即变化时修改独立封装一处对象即可,而非修改包含所有流程的某个分支)。