跳到主要内容

责任链模式

责任链模式为请求创建了一个处理器对象的链。如果一个对象不能处理请求,它会将请求传递给下一个处理器,直到请求被处理为止。

结构

责任链模式示意图责任链模式示意图

责任链模式中,客户端声明一系列处理器,并将请求传递给第一个处理器。每个处理器都包含一个指向下一个处理器的引用。如果一个处理器无法处理请求,它会将请求传递给下一个处理器。

信息

对比责任链模式和 装饰器模式 可以发现二者存在相似性。二者都是对某个对象的链式操作,但存在以下区别:

  • 责任链的管理者可以相互独立地执行一切操作,还可以随时停止传递请求。
  • 而各种装饰器可以在遵循基本接口的情况下扩展对象的行为;此外,装饰无法中断请求的传递。

应用场景

  • 需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时
  • 当对请求的处理需要遵循特定顺序时
  • 当需要动态地在运行时修改处理器的顺序时

优缺点

优点

  • 可以控制请求处理的顺序
  • 单一职责原则:可对发起操作和执行操作的类进行解耦。
  • 开闭原则:可以在不修改现有处理步骤的情况下添加新的处理器。

缺点

  • 无法保证请求一定会被处理

代码示例

下面的示例展示了一个使用责任链模式来验证门(Door 对象)尺寸的场景。

Handler 是一个抽象基类,定义了处理请求的接口和链接下一个处理器的能力。WidthHandlerHeightHandler 是具体的处理器,它们分别检查门的宽度和高度是否超过了设定的最大值。

在客户端代码中,我们将这些处理器链接成一个责任链。当一个 Door 对象被传递给链的第一个处理器时,它会依次通过链中的每个处理器进行验证。如果任何一个处理器发现验证失败,它会立即返回一个错误信息,请求处理就此中断。如果所有处理器都验证通过,请求就会成功地穿过整个链。