1、意图
- 使多个对象都有机会处理请求,从而避免请求的发送者和接收者间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2、动机
- 给多个对象“处理一个请求”的机会,从而解耦发送者和接收者。该请求沿对象链传递,直啊到有一个对象处理它。从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给下一个候选者。请求发送者并不明确地知道哪一个对象将会处理它。
3、适用性
- 有多个的对象可以处理同一个请求,哪个对象处理该请求由运行时刻自动确定;
- 想在不明确接收者的情况下,向多个对象中的一个提交一个请求;
- 可处理一个请求的对象集合应被动态指定。
4、结构
5、参与者
- Handler
- 定义一个处理请求的接口。
- (可选)实现后继链。 - ConcreteHandler
- 处理它所负责的请求。
- 可访问它的后继者。
- 如果可处理该请求,就处理之;否则将该请求转发给它的后继者。 - Client
- 向链上的具体处理者(ConcreteHandler)对象提交请求。
6、协作
- 当Client提交一个请求时,请求沿链传递直到有一个ConcreteHandler对象负责处理它。
7、效果
- 降低耦合度
职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。 - 增强了给对象指派职责(Responsibility)的灵活性
你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。
你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。 - 不保证请求被接受
一个请求可能到链的末端也没有被处理;也可能因该链没有被正确配置而得不到处理。
8、实现
- 实现后继者链
有两种方法:
1)定义新的链接(通常在Handler中定义,但也可由ConcreteHandlers定义)
2)使用已有的链接。
例如,一个部分-整体的层次结构中,父构件引用可作为一个部件的后继者。但如果该结构不能反映应用所需的职责链,必须定义额外的链接。 - 连接后继者
如果定义新的链接,那么Handler不仅需要定义处理请求的接口,通常也维护后继者链。 - 表示请求
1)请求时一个硬编码的操作调用。这种形式方便且安全,但是只能转发Handler类定义的固定的一组请求。
2)使用一个处理函数,这个函数以一个请求码(一个整数或字符串)为参数。这种方法支持请求数目不限,但是发送者和请求者应在请求的编码上达成一致。请求参数需要手工打包和解包。
3)使用独立的请求对象(Request类)作为请求参数。Request类可明确的描述请求,而新类型的请求可用它的子类来定义。处理者必须知道请求的类型(它正使用那个Request子类)以访问不同的请求参数。
9、相关模式
- 职责链常与Composite模式一起使用,这种情况下一个构件的父构件可作为它的后继。
注:此《重学设计模式》系列文章作者-wcyoot