目录
意图
- 通过让多个对象有机会处理请求,避免将请求的发送者与其接收者耦合。链接接收对象并沿链传递请求,直到对象处理它。
- 使用包含许多可能处理程序的单个处理管道启动和离开请求。
- 具有递归遍历的面向对象的链表。
问题
可能存在数量可变的“处理程序”或“处理元素”或“节点”对象,以及必须处理的请求流。需要在没有硬连接处理程序关系和优先级或请求到处理程序映射的情况下有效处理请求。

讨论
将处理元素封装在“管道”抽象中;并让客户在管道入口处“启动并留下”他们的请求。

该模式将接收对象链接在一起,然后将任何请求消息从一个对象传递到另一个对象,直到它到达一个能够处理该消息的对象。处理程序对象的数量和类型是先验未知的,它们可以动态配置。链接机制使用递归组合来允许链接无限数量的处理程序。
责任链简化了对象互连。与发送者和接收者保持对所有候选接收者的引用不同,每个发送者保持对链头的单个引用,每个接收者保持对链中其直接后继者的单个引用。
确保存在一个“安全网”来“捕获”任何未处理的请求。
当每个请求仅由一个处理程序处理时,或者当客户端对象知道应该由哪个服务对象处理请求时,不要使用责任链。
结构
派生类知道如何满足客户端请求。如果“当前”对象不可用或不够用,那么它将委托给基类,基类又委托给“下一个”对象,然后循环继续。

多个处理程序可能有助于处理每个请求。请求可以在链的整个长度上传递,最后一个链接注意不要委托给“null next”。
例子
责任链模式通过为多个对象提供处理请求的机会来避免将请求的发送者与接收者耦合。ATM 在货币捐赠机制中使用责任链。

检查清单
- 基类维护一个“next”指针。
- 每个派生类实现其对处理请求的贡献。
- 如果请求需要“传递”,则派生类“回调”基类,基类委托给“next”指针。
- 客户端(或某些第三方)创建并链接链(可能包括从最后一个节点到根节点的链接)。
- 客户端使用链的根“启动并离开”每个请求。
- 递归委托产生了魔法的幻觉。
经验法则
- 责任链、命令、中介者和观察者,解决了如何将发送者和接收者解耦,但需要权衡取舍。责任链沿潜在接收者链传递发送者请求。
- 责任链可以使用命令将请求表示为对象。
- 责任链通常与 Composite 结合使用。在那里,组件的父级可以充当其继任者。
本文来自转载,原文链接: