《责任链模式(极简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;
}
相关推荐
郝学胜-神的一滴6 小时前
Python 高级编程 026:内置数据结构之骈文纵论
开发语言·数据结构·python·程序人生·软件工程
隐积14 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
Tri_Function16 小时前
动态规划DP1(c++)
c++
名字还没想好☜17 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏18 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
酷在前行18 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
cxr82819 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
清水迎朝阳19 小时前
客户端软件 — 用户统计方案
服务器·c++·客户端·用户统计
废弃的小码农20 小时前
功能测试--Day07--Python编程基础
开发语言·python
再卷也是菜20 小时前
C++17(下)
c++