责任链模式(Chain of Responsibility Pattern)

简介: 责任链模式是一种行为型设计模式,允许多个对象按顺序处理请求,直到某个对象处理为止。适用于多个对象可能处理同一请求的场景,如请假审批流程。优点是灵活性高、降低耦合,但责任链过长可能影响性能。

责任链模式(Chain of Responsibility Pattern)详解

1. 定义

责任链模式是一种行为型设计模式,它允许多个对象都有机会处理请求,而无需请求的发送者知道具体哪个对象会处理。将这些对象连成一条链,沿着这条链传递请求,直到有对象处理它为止。

通俗解释:

想象一个公司中请假审批的过程,员工的请假单会沿着一个审批链,从主管到经理再到总监,直到某个人批准或拒绝为止。


2. 使用场景

使用场景 描述
多个对象可以处理同一请求 请求的处理者是动态决定的,不固定在一个对象上。
需要避免请求发送者与处理者的耦合 请求发送者无需知道谁会处理请求,只需将请求交给责任链的起点。
多个处理者按顺序处理请求 请求会沿着责任链依次传递,直到被某个处理者处理或达到链的末尾。

3. 优点与缺点

优点 缺点
降低耦合度:请求发送者与处理者分离。 性能问题:责任链过长会影响系统性能。
灵活性高:可以动态调整责任链的结构。 调试困难:请求沿链传递,可能难以跟踪和调试。
增强扩展性:新增处理者只需加入链中即可。 可能无响应:若无合适处理者,可能导致请求未被处理。

markdown输出表格

4. 责任链模式的组成

  1. Handler(处理者接口)
    定义一个处理请求的方法,并包含指向下一个处理者的引用。
  2. ConcreteHandler(具体处理者)
    实现处理者接口,根据自身逻辑决定是否处理请求或将其传递给下一个处理者。
  3. Client(客户端)
    创建责任链并向链的起点提交请求。

5. 使用案例

示例描述:

一个在线客服系统,用户的请求会依次传递给客服助手、普通客服、高级客服,直到请求被处理。


C++ 示例

#include <iostream>
#include <string>
using namespace std;

// 抽象处理者
class Handler {
protected:
   Handler* nextHandler = nullptr; // 下一个处理者
public:
   virtual ~Handler() {}
   void setNext(Handler* handler) {
       nextHandler = handler;
   }
   virtual void handleRequest(const string& request) {
       if (nextHandler) {
           nextHandler->handleRequest(request);
       } else {
           cout << "Request could not be handled: " << request << endl;
       }
   }
};

// 具体处理者1:客服助手
class AssistantHandler : public Handler {
public:
   void handleRequest(const string& request) override {
       if (request == "simple") {
           cout << "Assistant handled the request: " << request << endl;
       } else if (nextHandler) {
           nextHandler->handleRequest(request);
       }
   }
};

// 具体处理者2:普通客服
class CustomerHandler : public Handler {
public:
   void handleRequest(const string& request) override {
       if (request == "moderate") {
           cout << "Customer Service handled the request: " << request << endl;
       } else if (nextHandler) {
           nextHandler->handleRequest(request);
       }
   }
};

// 具体处理者3:高级客服
class SeniorHandler : public Handler {
public:
   void handleRequest(const string& request) override {
       if (request == "complex") {
           cout << "Senior Service handled the request: " << request << endl;
       } else if (nextHandler) {
           nextHandler->handleRequest(request);
       }
   }
};

// 客户端代码
int main() {
   Handler* assistant = new AssistantHandler();
   Handler* customer = new CustomerHandler();
   Handler* senior = new SeniorHandler();

   // 构建责任链
   assistant->setNext(customer);
   customer->setNext(senior);

   // 测试
   assistant->handleRequest("simple");
   assistant->handleRequest("moderate");
   assistant->handleRequest("complex");
   assistant->handleRequest("unknown");

   // 清理
   delete assistant;
   delete customer;
   delete senior;
   return 0;
}


C# 示例

using System;

// 抽象处理者
abstract class Handler {
   protected Handler NextHandler;

   public void SetNext(Handler handler) {
       NextHandler = handler;
   }

   public virtual void HandleRequest(string request) {
       if (NextHandler != null) {
           NextHandler.HandleRequest(request);
       } else {
           Console.WriteLine($"Request could not be handled: {request}");
       }
   }
}

// 具体处理者1:客服助手
class AssistantHandler : Handler {
   public override void HandleRequest(string request) {
       if (request == "simple") {
           Console.WriteLine($"Assistant handled the request: {request}");
       } else if (NextHandler != null) {
           NextHandler.HandleRequest(request);
       }
   }
}

// 具体处理者2:普通客服
class CustomerHandler : Handler {
   public override void HandleRequest(string request) {
       if (request == "moderate") {
           Console.WriteLine($"Customer Service handled the request: {request}");
       } else if (NextHandler != null) {
           NextHandler.HandleRequest(request);
       }
   }
}

// 具体处理者3:高级客服
class SeniorHandler : Handler {
   public override void HandleRequest(string request) {
       if (request == "complex") {
           Console.WriteLine($"Senior Service handled the request: {request}");
       } else if (NextHandler != null) {
           NextHandler.HandleRequest(request);
       }
   }
}

// 客户端代码
class Program {
   static void Main() {
       Handler assistant = new AssistantHandler();
       Handler customer = new CustomerHandler();
       Handler senior = new SeniorHandler();

       // 构建责任链
       assistant.SetNext(customer);
       customer.SetNext(senior);

       // 测试
       assistant.HandleRequest("simple");
       assistant.HandleRequest("moderate");
       assistant.HandleRequest("complex");
       assistant.HandleRequest("unknown");
   }
}


责任链模式的类图

6. 责任链模式与其他模式对比

特性 责任链模式 状态模式
核心作用 请求沿链传递,直到某个对象处理或结束。 对象在不同状态间切换,行为取决于当前状态。
封装性 封装请求处理逻辑与发送逻辑。 封装状态相关的行为。
使用场景 多个处理者可能对同一请求感兴趣。 对象行为会随状态而变化。
是否有请求终点 可能无终点,请求可能未被处理。 总有状态,行为不会丢失。

总结

  • 适用场景: 当请求可能被多个对象处理,且不需要显式指定处理者时。
  • 优点: 灵活性高,降低耦合,易于扩展。
  • 注意事项: 责任链过长可能导致性能问题,需合理设计链的长度和顺序。
相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
24071 2
|
1月前
|
安全 JavaScript API
OpenClaw“小龙虾”3步搭建及Skills筛选指南:必装Skills清单+零基础部署与阿里云百炼API配置及避坑指南
OpenClaw(开发者昵称“小龙虾”)的核心魅力在于开放的Skills生态,但多数用户在使用中会陷入共性困境:ClawHub上数万款技能让人眼花缭乱,盲目安装后不仅没提升效率,反而出现运行卡顿、功能冲突、安全隐患等问题。正如参考文章所指出的,模型再强,没有好用的“手脚”也难以落地——真正决定OpenClaw实用性的,是一套“稳定、高效、可维护”的Skills体系。
1764 4
|
6月前
|
存储 自然语言处理 算法
参照Yalla、Hawa等主流APP核心功能,开发一款受欢迎的海外语聊需要从哪些方面入手
海外语聊APP开发需结合Yalla、Hawa等主流产品,聚焦多语言支持、实时音视频、社交互动与安全合规。兼顾技术架构、本地化运营与法律风险,避免劣质成品代码,平衡创新与成本,打造差异化出海产品。(239字)
|
人工智能 Serverless API
测评报告:零门槛、轻松部署您的专属 DeepSeek 模型
### 测评报告:零门槛、轻松部署您的专属 DeepSeek 模型 DeepSeek 是一款强大的推理模型,尤其擅长数学、代码和自然语言处理任务。由于算力限制,官方服务支持不稳定,阿里云提供了四种云上调用及部署方案,包括基于百炼调用API、PAI平台部署、函数计算部署和GPU云服务器部署。测评显示,PAI平台最具灵活性和易用性,但整体方案在文档指引、部署时间和成本方面仍有改进空间。建议优化文档和技术支持,提升用户体验。
833 3
|
存储 机器学习/深度学习 人工智能
【AI系统】计算图优化架构
本文介绍了推理引擎转换中的图优化模块,涵盖算子融合、布局转换、算子替换及内存优化等技术,旨在提升模型推理效率。计算图优化技术通过减少计算冗余、提高计算效率和减少内存占用,显著改善模型在资源受限设备上的运行表现。文中详细探讨了离线优化模块面临的挑战及解决方案,包括结构冗余、精度冗余、算法冗余和读写冗余的处理方法。此外,文章还介绍了ONNX Runtime的图优化机制及其在实际应用中的实现,展示了如何通过图优化提高模型推理性能的具体示例。
930 4
【AI系统】计算图优化架构
|
设计模式 存储 C#
迭代器模式(Iterator Pattern)
迭代器模式是一种行为型设计模式,用于提供一种顺序访问集合对象元素的方法,而不暴露集合的内部表示。通过迭代器模式,用户可以独立于集合的实现来遍历集合。适用于需要以一致方式遍历不同类型集合的场景,分离集合的遍历逻辑和集合的实现,增强灵活性。但需注意迭代器的内存开销。
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
572 6
|
设计模式 数据安全/隐私保护
探索责任链模式:在项目中的应用与实践
在软件设计模式中,责任链模式(Chain of Responsibility)是一种对象行为型模式,它允许一个请求沿着链式结构的多个对象传递,直到有一个对象处理它为止。这种模式在实际项目中有着广泛的应用,尤其是在处理复杂的业务逻辑和解耦系统中。本文将分享责任链模式的基本概念、应用场景以及在项目中的实践案例。
456 5
|
SQL 分布式计算 Hadoop
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
690 2
|
JavaScript 搜索推荐 前端开发
从零搭建到部署:Angular与Angular Universal手把手教你实现服务器端渲染(SSR),全面解析及实战指南助你提升Web应用性能与SEO优化效果
【8月更文挑战第31天】服务器端渲染(SSR)是现代Web开发的关键技术,能显著提升SEO效果及首屏加载速度,改善用户体验。Angular Universal作为官方SSR解决方案,允许在服务器端生成静态HTML文件。本文通过具体示例详细介绍如何使用Angular Universal实现SSR,并分享最佳实践。首先需安装Node.js和npm。
702 1
下一篇
开通oss服务