责任链模式
责任链模式为请求创建了一个处理器对象的链。如果一个对象不能处理请求,它会将请求传递给下一个处理器,直到请求被处理为止。
结构
责任链模式示意图
责任链模式中,客户端声明一系列处理器,并将请求传递给第一个处理器。每个处理器都包含一个指向下一个处理器的引用。如果一个处理器无法处理请求,它会将请求传递给下一个处理器。
信息
对比责任链模式和 装饰器模式 可以发现二者存在相似性。二者都是对某个对象的链式操作,但存在以下区别:
- 责任链的管理者可以相互独立地执行一切操作,还可以随时停止传递请求。
- 而各种装饰器可以在遵循基本接口的情况下扩展对象的行为;此外,装饰无法中断请求的传递。
应用场景
- 需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时
- 当对请求的处理需要遵循特定顺序时
- 当需要动态地在运行时修改处理器的顺序时
优缺点
优点
- 可以控制请求处理的顺序
- 单一职责原则:可对发起操作和执行操作的类进行解耦。
- 开闭原则:可以在不修改现有处理步骤的情况下添加新的处理器。
缺点
- 无法保证请求一定会被处理
代码示例
下面的示例展示了一个使用责任链模式来验证门(Door
对象)尺寸的场景。
Handler
是一个抽象基类,定义了处理请求的接口和链接下一个处理器的能力。WidthHandler
和 HeightHandler
是具体的处理器,它们分别检查门的宽度和高度是否超过了设定的最大值。
在客户端代码中,我们将这些处理器链接成一个责任链。当一个 Door
对象被传递给链的第一个处理器时,它会依次通过链中的每个处理器进行验证。如果任何一个处理器发现验证失败,它会立即返回一个错误信息,请求处理就此中断。如果所有处理器都验证通过,请求就会成功地穿过整个链。