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

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


模式说明

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

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

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

示例代码

#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;
}

相关推荐

  1. 责任模式c++)》

    2024-03-30 13:02:01       19 阅读
  2. 模版模式c++)》

    2024-03-30 13:02:01       11 阅读
  3. c# 责任模式

    2024-03-30 13:02:01       39 阅读
  4. 《工厂模式c++)》

    2024-03-30 13:02:01       21 阅读
  5. 《原型模式c++)》

    2024-03-30 13:02:01       25 阅读
  6. 《过滤器模式c++)》

    2024-03-30 13:02:01       21 阅读
  7. 《适配器模式c++)》

    2024-03-30 13:02:01       19 阅读
  8. 《组合模式c++)》

    2024-03-30 13:02:01       20 阅读
  9. 《外观模式c++)》

    2024-03-30 13:02:01       18 阅读
  10. 《备忘录模式c++)》

    2024-03-30 13:02:01       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 13:02:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 13:02:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 13:02:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 13:02:01       20 阅读

热门阅读

  1. 使用verilog实现俄罗斯方块游戏

    2024-03-30 13:02:01       19 阅读
  2. pyinstaller将文件内容打包到可执行文件本身中

    2024-03-30 13:02:01       19 阅读
  3. Ubuntu服务器搭建 - 环境篇

    2024-03-30 13:02:01       17 阅读
  4. RabbitMQ的部分模式

    2024-03-30 13:02:01       18 阅读
  5. 关于学习编程和技术的自述

    2024-03-30 13:02:01       17 阅读
  6. 每日更新5个Python小技能 | 第六期

    2024-03-30 13:02:01       17 阅读
  7. Hive窗口函数笔试题(面试题)

    2024-03-30 13:02:01       21 阅读
  8. Android studio 老旧版本下载地址

    2024-03-30 13:02:01       22 阅读
  9. leetcode 62.不同路径

    2024-03-30 13:02:01       14 阅读
  10. 电子元器件商城模式的安全与风险管理

    2024-03-30 13:02:01       24 阅读
  11. 算法——图论:路径,回溯

    2024-03-30 13:02:01       18 阅读