首页 > 编程语言 >《责任链模式(极简c++)》

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

时间:2024-03-29 13:01:24浏览次数:31  
标签:极简 const req Request c++ 责任 Handler handleRequest public

        本文章属于专栏- 概述 - 《设计模式(极简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;
}

标签:极简,const,req,Request,c++,责任,Handler,handleRequest,public
From: https://blog.csdn.net/ly52352148/article/details/137141737

相关文章

  • 《代理模式(极简c++)》
            本文章属于专栏-概述-《设计模式(极简c++版)》-CSDN博客模式说明方案:代理模式充当了客户端和实际对象之间的中介,通过引入代理对象来控制对原始对象的访问。优点:通过代理,可以实现对目标对象的控制,提供更多的功能,例如延迟加载、访问控制、日志记录等。缺点......
  • MD5 计算 (下一代加密辅助类, Win32, C++)
    CCNGHelper.h#pragmaonce#include<string>#include<tchar.h>#include<windows.h>#include<bcrypt.h>#ifdef_UNICODEusing_tstring=std::wstring;#elseusing_tstring=std::string;#endif//下一代加密辅助类//客户端:WindowsVista及......
  • c++ string
     字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种,一种来自C语言,常被称为C-风格字符串,另一种是基于string类库的字符串处理方式。C风格字符串的处理可以参考 https://www.cnblogs.com/tongye/p/10688941.html ,本文着重介绍string类库的使用。......
  • C++学习笔记——007
    注意,int*pt;中pt是int值的地址并不意味着pt本身的类型是int。例如,在有些平台中,int类型是个2字节值,而地址是个4字节值。 对于指针,需要指出的另一点是,new分配的内存块通常与常规变量声明分配的内存块不同。常规变量的值都存储在被称为栈(stack)的内存区域中,而new从被称为堆(he......
  • C++学习笔记——006
    事实上,任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。因此,下面所有的输出语句都是等效的:cout<<"I'dgivemyrightarmtobe""agreatviolinist.\n";cout<<"I'dgivemyrightarmtobeagreatviolinist.\n";cout<<&qu......
  • lanqiao106. 正则问题 (第八届蓝桥杯C++A组)或者 acwing 1225. 正则问题
    问题:知识补充:1. 正则表达式的计算①括号代表优先计算,②或符号代表二选一。比如给的例子:((xx|xxx)x|(x|xx))xx 2. 字符串的语法问题:string是字符串的类型,使用的时候也使像字符一样使用,加入定义stringstr,那么使用的时候要写成str[]思考:妈呀一开始我不会算正则表达......
  • C++取经之路(其二)——含数重载,引用。
    含数重载:函数重载是指:在c++中,在同一作用域,函数名相同,形参列表不相同(参数个数,或类型,或顺序)不同,C语言不支持。举几个例子:1.参数类型不同intAdd(intleft,intright){ cout<<"intAdd(intleft,intright)"<<endl; returnleft+right;}doubleAdd(doublele......
  • C++17 一些新特性的简单描述
    其实很多17的官方新特性早就被很多非官方的库支持,反复验证完善后被官方收录。1、std::optionalstd::optional<vector<int>>list={}/std::nullopt/{{}};不就是表示一个值存在与否是可选的吗注意下{{}}和nullopt的区别,笔者偶尔遇见过相关bug,毕竟通信行业,信息内容中空列表......
  • C++ 字符串完全指南:学习基础知识到掌握高级应用技巧
    C++字符串字符串用于存储文本。一个字符串变量包含由双引号括起来的一组字符:示例创建一个string类型的变量并为其赋值:stringgreeting="Hello";C++字符串连接字符串连接可以使用+运算符来实现,生成一个新的字符串。示例:stringfirstName="John";stringlastN......
  • 安装 Visual C++ 可再发行组件包的简单方法
    安装VisualC++RedistributablePackages的最佳方法安装对Wampserver(以及许多其他软件)至关重要的VC++可再发行组件的最简单、最简单、最不容易出错、最快的方法是使用一个程序,该程序通过单个可执行文件安装所需的所有内容。不,这不是乌托邦!它存在,它是名为VisualCppRedistA......