职责链模式(Chain of Responsibility Pattern)

定义

职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许对象接收请求并将其沿着处理者链传递,直到有一个处理者处理它为止。职责链模式通过将请求的处理逻辑分布

在职责链模式中,通常包含以下几个角色:

  1. Handler(处理者):定义处理请求的接口,包含处理请求和设置下一个处理者的方法。

  2. ConcreteHandler(具体处理者):实现处理者接口,处理其负责的请求,如果请求不属于它的责任范围,则将其传递给链中的下一个处理者。

示例

下面是一个简单的C++示例,演示了职责链模式的应用:

cpp 复制代码
#include <iostream>  
#include <string>  
  
// 处理者接口  
class Handler {  
public:  
    virtual ~Handler() = default;  
  
    // 设置下一个处理者  
    void setNext(Handler* next) {  
        nextHandler = next;  
    }  
  
    // 处理请求  
    virtual void handleRequest(const std::string& request) {  
        if (nextHandler) {  
            nextHandler->handleRequest(request); // 如果存在下一个处理者,则传递给下一个处理者  
        } else {  
            std::cout << "No handler available to handle the request: " << request << std::endl;  
        }  
    }  
  
protected:  
    Handler* nextHandler = nullptr; // 指向下一个处理者的指针  
};  
  
// 具体处理者A,负责处理以"A"开头的请求  
class ConcreteHandlerA : public Handler {  
public:  
    void handleRequest(const std::string& request) override {  
        if (request.find("A") == 0) {  
            std::cout << "ConcreteHandlerA handles the request: " << request << std::endl;  
        } else {  
            Handler::handleRequest(request); // 如果请求不属于A处理,则传递给链中的下一个处理者  
        }  
    }  
};  
  
// 具体处理者B,负责处理以"B"开头的请求  
class ConcreteHandlerB : public Handler {  
public:  
    void handleRequest(const std::string& request) override {  
        if (request.find("B") == 0) {  
            std::cout << "ConcreteHandlerB handles the request: " << request << std::endl;  
        } else {  
            Handler::handleRequest(request); // 如果请求不属于B处理,则传递给链中的下一个处理者  
        }  
    }  
};  
  
int main() {  
    // 创建处理者对象并设置职责链  
    ConcreteHandlerA* handlerA = new ConcreteHandlerA();  
    ConcreteHandlerB* handlerB = new ConcreteHandlerB();  
    handlerA->setNext(handlerB);  
  
    // 发送请求  
    handlerA->handleRequest("RequestA"); // 应该由ConcreteHandlerA处理  
    handlerA->handleRequest("RequestB"); // 应该由ConcreteHandlerB处理  
    handlerA->handleRequest("RequestC"); // 没有处理者可以处理,输出错误信息  
  
    delete handlerA;  
    delete handlerB;  
  
    return 0;  
}

在这个示例中,我们定义了一个Handler接口和两个具体处理者ConcreteHandlerAConcreteHandlerB。每个处理者都包含一个指向下一个处理者的指针,用于构建处理者链。当处理者收到请求时,它首先检查请求是否属于它的责任范围。如果是,则处理该请求;如果不是,则将请求传递给链中的下一个处理者。如果没有处理者能够处理请求,则输出错误信息。

职责链模式的主要优点包括:

  1. 解耦:发送者和接收者之间的解耦,发送者只需要知道如何向链中传递请求,而不需要知道请求的具体处理者。

  2. 灵活性:可以通过动态地改变链内的处理者来改变请求的处理方式。

  3. 支持多个处理者:允许有多个处理者同时处理一个请求。

职责链模式的潜在缺点包括:

  1. 性能:如果链中的处理者数量很多,且请求需要逐个传递,可能会导致性能下降。

  2. 请求可能得不到处理:如果没有处理者处理请求,则请求可能会丢失或返回错误。

在实际应用中,职责链模式常用于处理异常、日志记录、命令模式中的命令执行等场景。

相关推荐
牵牛老人2 天前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式
C4程序员6 天前
项目设计模式:责任链模式
设计模式·责任链模式
Hanson Huang8 天前
23种设计模式-责任链(Chain of Responsibility)设计模式
java·设计模式·责任链模式·行为型设计模式
java技术小馆22 天前
责任链模式如何减少模块之间的耦合
java·数据库·设计模式·责任链模式
_躬行_22 天前
策略模式和责任链模式的区别
责任链模式·策略模式
worxfr22 天前
【最佳实践】Go 责任链模式实现参数校验
服务器·golang·责任链模式
香菇滑稽之谈23 天前
责任链模式的C++实现示例
开发语言·c++·设计模式·责任链模式
赤水无泪25 天前
行为模式---责任链模式
责任链模式
工一木子1 个月前
【HeadFirst系列之HeadFirst设计模式】第17天之深入责任链模式:应对复杂请求处理的设计思路
java·设计模式·责任链模式
攻城狮7号1 个月前
【第21节】C++设计模式(行为模式)-Chain of Responsibility(责任链)模式
c++·设计模式·责任链模式