设计模式——职责链模式

职责链模式(Chain of Responsibility)

  使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

  发出请求的客户端并不知道职责链中哪一个对象处理了请求,这样就可以实现在不影响客户端的情况下动态地重新组织和分配任务。

代码如下

c++ 复制代码
#include <iostream>
#include <string>
#include <vector>

using namespace std;

// Handler类,定义一个处理请示的接口
class Handler{
public:
    // 设置继任者
    void SetSuccessor(Handler *successor){
        successor_ = successor;
    }

    // 处理请求的抽象方法
    virtual void HandleRequest(int request) = 0;

protected:
    Handler *successor_;
};


// ConcreteHandler1类, 当请求数在0到10之间则有权处理,否则转到下一位
class ConcreteHandler1 : public Handler{
public:
    void HandleRequest(int request) override{
        if(request>=0 && request<10){
            cout << "ConcreteHandler1 处理请求" << endl;
        }
        else if(successor_ != nullptr){
            // 转移到下一位
            successor_->HandleRequest(request);
        }
    }
};

// ConcreteHandler1类, 当请求数在10到20之间则有权处理,否则转到下一位
class ConcreteHandler2 : public Handler{
public:
    void HandleRequest(int request) override{
        if(request>=10 && request<20){
            cout << "ConcreteHandler2 处理请求" << endl;
        }
        else if(successor_ != nullptr){
            // 转移到下一位
            successor_->HandleRequest(request);
        }
    }
};

// ConcreteHandler3类, 当请求数在20到30之间则有权处理,否则转到下一位
class ConcreteHandler3 : public Handler{
public:
    void HandleRequest(int request) override{
        if(request>=20 && request<30){
            cout << "ConcreteHandler3 处理请求" << endl;
        }
        else if(successor_ != nullptr){
            // 转移到下一位
            successor_->HandleRequest(request);
        }
    }
};


// 客户端代码,向链上的具体处理者对象提交请求
void Client(){
    Handler *h1 = new ConcreteHandler1();
    Handler *h2 = new ConcreteHandler2();
    Handler *h3 = new ConcreteHandler3();
    h1->SetSuccessor(h2);
    h2->SetSuccessor(h3);

    vector<int> request = {2, 5, 14, 22, 18, 3, 27, 20};
    for(int a:request){
        h1->HandleRequest(a);
    }
}

int main(){
    Client();
    return 0;
}

输出为

复制代码
ConcreteHandler1 处理请求
ConcreteHandler1 处理请求
ConcreteHandler2 处理请求
ConcreteHandler3 处理请求
ConcreteHandler2 处理请求
ConcreteHandler1 处理请求
ConcreteHandler3 处理请求
ConcreteHandler3 处理请求
相关推荐
咖啡八杯2 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
槑有老呆2 天前
别再手搓 Prompt 了,那个叫"手动挡循环"
设计模式
用户6919026813392 天前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
怕浪猫3 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
Larcher5 天前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
咖啡八杯6 天前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
:mnong6 天前
学习创建结构行为设计模式
设计模式
w_t_y_y7 天前
Agent设计模式(四)多模态融合模式(Multi-Modal Fusion)
设计模式
zhouhui0017 天前
订单状态的 if-else 地狱上线就崩——状态模式的工业级落地
设计模式