Lazy loaded image
职责链模式(Chain of Responsibility):让请求在链条上自由流动hdefault
Words 1760Read Time 5 min
2026-1-22

1. 设计模式概述

职责链模式(Chain of Responsibility)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。
想象一下,你去银行办理业务,首先需要去前台咨询,如果前台无法处理,他们会把你引导到经理那里,如果经理也无法处理,最终可能会把你引导到行长那里。这就是职责链模式的一个生动例子——每个角色都有机会处理你的请求,直到问题被解决。

2. 动机

在软件开发中,我们经常会遇到这样的情况:一个请求可能需要多个对象中的某一个来处理,但我们并不确定具体是哪一个对象。如果我们将请求的发送者与接收者紧密耦合,代码会变得难以维护和扩展。
职责链模式通过将多个处理对象连成一条链,使得请求可以沿着链传递,直到有一个对象处理它。这种方式不仅降低了耦合度,还使得我们可以动态地调整链上的处理对象,增强了系统的灵活性。

3. 适用性

职责链模式适用于以下场景:
  • 多个对象可以处理同一个请求,但具体由哪个对象处理在运行时才能确定。例如,日志系统中不同级别的日志由不同的处理器处理。
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交请求。例如,事件处理系统。
  • 你希望动态地指定处理请求的对象集合。例如,工作流系统。

4. 结构图

下面是用Mermaid绘制的职责链模式结构图:
在这个图中,Handler是一个抽象类,定义了处理请求的接口,并维护了一个指向后继者(successor)的引用。ConcreteHandlerAConcreteHandlerBConcreteHandlerC是具体的处理者,它们实现了HandleRequest方法,决定是否处理请求或将其传递给下一个处理者。

5. 参与者

  • Handler:定义了处理请求的接口,并维护了一个指向后继者的引用。
  • ConcreteHandler:具体的处理者,实现了HandleRequest方法,决定是否处理请求或将其传递给下一个处理者。
  • Client:向链上的具体处理者对象提交请求。

6. C++代码示例

下面是一个简单的C++实现示例,展示了如何使用职责链模式来处理不同级别的日志消息。
在这个示例中,Request类代表了一个日志请求,包含日志内容和日志级别。Handler是抽象处理者,ConcreteHandlerAConcreteHandlerBConcreteHandlerC是具体处理者。每个处理者根据日志级别决定是否处理请求,或者将其传递给下一个处理者。

7. 使用效果与限制

使用效果

  • 降低耦合度:请求的发送者无需知道具体由哪个对象处理请求,只需将请求发送到链上即可。
  • 增强灵活性:可以在运行时动态地改变链上的处理对象,或者调整处理顺序。
  • 简化对象间的连接:只需在链上设置后继者,而不需要显式地指定每个处理者的下一个处理者。

限制

  • 请求可能未被处理:如果链上没有处理者能够处理请求,请求可能会被忽略。因此,需要确保链上至少有一个处理者能够处理所有可能的请求。
  • 性能问题:如果链过长,可能会导致请求传递的开销增加,从而影响性能。
  • 调试困难:由于请求在链上传递,调试时可能会难以追踪请求的具体处理过程。

工程实例

在一个大型的Web应用程序中,职责链模式可以用于处理用户请求。例如,当用户提交一个表单时,请求可能会依次经过身份验证、数据验证、业务逻辑处理等多个步骤。每个步骤都可以由一个独立的处理者来负责,形成一个职责链。这样,每个处理者只需关注自己负责的部分,而不需要知道其他处理者的存在,从而实现模块化和解耦。

总结

职责链模式通过将多个处理对象连成一条链,使得请求可以沿着链传递,直到有一个对象处理它。这种模式不仅降低了耦合度,还增强了系统的灵活性。然而,使用职责链模式时也需要注意请求可能未被处理以及性能问题。在实际项目中,职责链模式可以应用于日志处理、事件处理、工作流系统等场景,帮助开发者构建更加灵活和可维护的系统。
 
上一篇
XIAOMI 面试题
下一篇
用面试拷问嵌入式技术栈

Comments
Loading...