《责任链模式(极简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;
}
相关推荐
Jackson@ML19 分钟前
如何快速高效学习Python?
开发语言·python
西瓜本瓜@2 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
UFIT2 小时前
Python函数与模块笔记
开发语言·python
机智的人猿泰山2 小时前
java kafka
java·开发语言·kafka
Y1nhl2 小时前
搜广推校招面经八十一
开发语言·人工智能·pytorch·深度学习·机器学习·推荐算法·搜索算法
Algorithm15762 小时前
谈谈接口和抽象类有什么区别?
java·开发语言
Starry_hello world2 小时前
C++ 快速幂算法
c++·算法·有问必答
yu4106212 小时前
Rust 语言使用场景分析
开发语言·后端·rust
良艺呐^O^2 小时前
uniapp实现app自动更新
开发语言·javascript·uni-app
264玫瑰资源库4 小时前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏