设计模式——职责链模式

职责链模式(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 处理请求
相关推荐
evans在进步10 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
字节跳动开源16 小时前
VisActor全新图可视化开源项目:VGraph
前端·设计模式·开源
码匠许师傅17 小时前
【设计模式精讲】11.桥接模式(Bridge)
c++·设计模式·桥接模式·uml
学习星球2 天前
AI Agent 成本工程实战:从 OpenAI Codex 的 8 个“烧 Token“Bug 学起
人工智能·设计模式·微信小程序
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
码匠许师傅3 天前
【设计模式精讲】7.建造者模式(Builder)
设计模式·建造者模式
码匠许师傅3 天前
【设计模式精讲】6.抽象工厂(Abstract Factory)
c++·设计模式
workflower3 天前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
Java后端的Ai之路3 天前
03、Python - 抽象工厂模式
开发语言·python·设计模式·抽象工厂模式·通用智慧
AI人工智能+电脑小能手4 天前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc