《责任链模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


模式说明

  • 方案: 责任链模式将请求的发送者和接收者解耦,构成一个链条,并由多个对象对请求进行处理,直到找到合适的处理者为止。
  • 优点: 实现了请求发送者和接收者的解耦,灵活性高,易于扩展,每个处理者只需关注自己的处理逻辑。
  • 缺点: 会影响性能,且不易维护

本质思想:责任链模式的本质思想是将多个处理者组成一条链,依次尝试处理请求,直到找到能够处理该请求的对象为止。

实践建议:不建议使用。该模式会降低性能,且分离的处理逻辑分支,会降低代码可读性。当遇到逻辑复杂,判断分支繁琐的逻辑,我们要做的是解耦,而不是把代码简单地拆开。

示例代码

cpp 复制代码
#include <iostream>

// 请求类
class Request {
public:
    int value;

    Request(int v) : value(v) {}
};

// 处理者接口
class Handler {
protected:
    Handler* successor;

public:
    Handler() : successor(nullptr) {}

    void setSuccessor(Handler* handler) {
        successor = handler;
    }

    virtual void handleRequest(const Request& req) const = 0;
};

// 具体处理者A
class ConcreteHandlerA : public Handler {
public:
    void handleRequest(const Request& req) const override {
        if (req.value < 10) {
            std::cout << "ConcreteHandlerA handles the request." << std::endl;
        } else if (successor != nullptr) {
            successor->handleRequest(req);
        }
    }
};

// 具体处理者B
class ConcreteHandlerB : public Handler {
public:
    void handleRequest(const Request& req) const override {
        if (req.value >= 10 && req.value < 20) {
            std::cout << "ConcreteHandlerB handles the request." << std::endl;
        } else if (successor != nullptr) {
            successor->handleRequest(req);
        }
    }
};

// 客户端代码
int main() {
    // 构建责任链
    Handler* handlerA = new ConcreteHandlerA();
    Handler* handlerB = new ConcreteHandlerB();
    handlerA->setSuccessor(handlerB);

    // 发送请求
    Request req1(5);
    Request req2(15);
    handlerA->handleRequest(req1); // 输出:ConcreteHandlerA handles the request.
    handlerA->handleRequest(req2); // 输出:ConcreteHandlerB handles the request.

    // 释放内存
    delete handlerA;
    delete handlerB;

    return 0;
}
相关推荐
暮雪倾风36 分钟前
【JS-Node】node.js环境安装及使用
开发语言·javascript·node.js
Dxy12393102168 小时前
Python 使用正则表达式将多个空格替换为一个空格
开发语言·python·正则表达式
故事和你919 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__9 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__10 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
techdashen10 小时前
Rust项目公开征测:Cargo 构建目录新布局方案
开发语言·后端·rust
星空椰10 小时前
JavaScript 进阶基础:函数、作用域与常用技巧总结
开发语言·前端·javascript
忒可君10 小时前
C# winform 自制分页功能
android·开发语言·c#
Rust研习社11 小时前
Rust 智能指针 Cell 与 RefCell 的内部可变性
开发语言·后端·rust
王老师青少年编程11 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心