责任链模式(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. 责任链模式与其他模式对比

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

总结

  • 适用场景: 当请求可能被多个对象处理,且不需要显式指定处理者时。
  • 优点: 灵活性高,降低耦合,易于扩展。
  • 注意事项: 责任链过长可能导致性能问题,需合理设计链的长度和顺序。
目录
相关文章
|
物联网 Java 开发工具
如何编辑一个NFC的软件
如何编辑一个NFC的软件
475 1
|
9月前
|
设计模式 C# C++
适配器模式(Adapter Pattern)
适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户期望的另一个接口,使原本接口不兼容的类可以一起工作。它包括目标接口、适配者和适配器三个核心角色。适配器模式常用于解决旧系统兼容性问题、第三方库整合和统一接口等场景。该模式有类适配器和对象适配器两种实现方式,分别通过继承和组合实现。适配器模式的优点包括提高兼容性、遵循开闭原则和灵活性高,但也存在适配器数量增加导致复杂性和可能影响性能的缺点。
306 1
|
9月前
|
设计模式 算法 定位技术
策略模式(Strategy Pattern)
策略模式(Strategy Pattern)是一种行为型设计模式,允许在运行时选择算法或行为,而不是在编译时确定。通过将具体算法封装成独立的类,并通过统一接口与客户端交互,实现算法的动态替换,避免代码重复和复杂条件语句。适用于支付方式切换、导航路径选择等场景。
258 1
|
10月前
|
设计模式 数据安全/隐私保护
责任链模式实战:在项目中的应用与技巧
在软件工程中,责任链模式(Chain of Responsibility)是一种对象行为型设计模式,它允许多个对象有机会处理请求,从而避免请求发送者与接收者之间的耦合。这种模式在处理复杂的业务逻辑和系统解耦方面非常有用。本文将探讨责任链模式的基本概念、应用场景以及在实际项目中的应用技巧。
208 4
|
9月前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
3766 101
|
9月前
|
XML 设计模式 JSON
模板方法模式(Template Method Pattern)
模板方法模式是一种行为型设计模式,定义一个操作中的算法骨架,将某些步骤的实现延迟到子类。子类可以在不改变算法结构的情况下重新定义算法的某些步骤。适用于多个类有相似操作流程且部分步骤需要定制的场景。优点包括高复用性、扩展性强和清晰明确;缺点是灵活性降低和可能引入性能开销。示例包括文件解析和策略模式的对比。
120 3
模板方法模式(Template Method Pattern)
|
9月前
|
存储 设计模式 算法
命令模式(Command Pattern)
命令模式是一种行为型设计模式,将请求封装为对象,实现参数化请求、支持撤销操作和记录日志。适用于需要解耦发送者和接收者的场景,如智能家居系统中的遥控器控制电灯开关并支持撤销功能。优点包括解耦、支持撤销与恢复操作,但过度使用会增加系统复杂度。
143 7
|
9月前
|
设计模式 监控 数据库
代理模式(Proxy Pattern)
代理模式(Proxy Pattern)是一种设计模式,通过一个中间对象(代理)来间接访问目标对象,以控制访问权限或添加额外功能。常见的代理类型包括远程代理、虚拟代理、保护代理和智能引用代理。代理模式常用于延迟加载、权限控制、日志记录等场景,能够提高系统的灵活性和安全性。
331 3
|
9月前
|
设计模式 C# C++
建造者模式详解
建造者模式是一种创建型设计模式,通过将对象的构造与表示分离,使得同样的构建过程可以创建不同的对象。它适用于复杂对象的构建,如汽车制造、软件配置生成等场景。该模式的核心角色包括抽象建造者、具体建造者、产品和指挥者。优点包括解耦构造和表示、代码复用性强、易于扩展;缺点是增加代码复杂度,对产品组成部分有依赖。
196 3
|
9月前
|
设计模式 数据库 C#
外观模式(Facade Pattern)
外观模式(Facade Pattern)是一种结构型设计模式,为子系统中的一组接口提供一个一致的接口。它通过一个高层接口简化子系统的复杂性,使客户端更容易使用。外观模式的核心角色包括外观(Facade)和子系统(Subsystems),主要优点是降低复杂性和松耦合,适用于简化接口、分层设计和遗留代码集成等场景。
112 2