责任链模式的C++实现示例

ops/2025/3/16 12:56:16/

核心思想

责任链模式是一种行为设计模式,允许多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合。请求沿着处理链传递,直到某个对象处理它为止。

解决的问题

解耦请求发送者与处理者:请求的发送者无需知道具体由哪个对象处理请求。
​动态分配责任:可以在运行时动态调整处理链,灵活添加或移除处理者。
​避免硬编码:避免将请求处理逻辑硬编码在某个类中,提高代码的可扩展性和可维护性。

使用场景

​多级审批流程:如请假审批、报销审批等,每一级领导都可以处理或传递给上级。
​事件处理系统:如 GUI 事件处理,事件可以沿着组件链传递,直到被处理。
​日志记录系统:不同级别的日志消息可以被不同的日志处理器处理。
​过滤器链:如 HTTP 请求过滤器,每个过滤器可以处理请求或传递给下一个过滤器。

优点

​解耦:请求发送者与处理者解耦,发送者无需知道具体处理者。
​动态性:可以在运行时动态调整处理链。
​单一职责:每个处理者只关注自己的职责,符合单一职责原则。

缺点

​性能问题:如果链过长,可能导致请求传递效率低下。
​不确定性:请求可能未被任何处理者处理,需要额外逻辑处理这种情况。

示例代码

以下是一个简单的责任链模式示例,模拟多级审批流程:

#include <iostream>
#include <memory>
#include <string>// 请求类
class Request {
public:Request(const std::string& content, int level) : content_(content), level_(level) {}std::string getContent() const { return content_; }int getLevel() const { return level_; }private:std::string content_; // 请求内容int level_;           // 请求级别
};// 处理者基类
class Handler {
public:virtual ~Handler() = default;void setNext(std::shared_ptr<Handler> next) { next_ = next; }virtual void handleRequest(const Request& request) {if (next_) {next_->handleRequest(request); // 传递给下一个处理者} else {std::cout << "Request未被处理: " << request.getContent() << std::endl;}}protected:std::shared_ptr<Handler> next_; // 下一个处理者
};// 具体处理者:经理
class Manager : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 1) {std::cout << "经理处理请求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 传递给下一个处理者}}
};// 具体处理者:总监
class Director : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 2) {std::cout << "总监处理请求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 传递给下一个处理者}}
};// 具体处理者:CEO
class CEO : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 3) {std::cout << "CEO处理请求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 传递给下一个处理者}}
};int main() {// 创建处理链auto manager = std::make_shared<Manager>();auto director = std::make_shared<Director>();auto ceo = std::make_shared<CEO>();manager->setNext(director);director->setNext(ceo);// 创建请求Request request1("请假1天", 1);  // 经理处理Request request2("请假3天", 2);  // 总监处理Request request3("请假10天", 3); // CEO处理Request request4("请假30天", 4); // 未被处理// 处理请求manager->handleRequest(request1);manager->handleRequest(request2);manager->handleRequest(request3);manager->handleRequest(request4);return 0;
}

输出结果

经理处理请求: 请假1天
总监处理请求: 请假3天
CEO处理请求: 请假10天
Request未被处理: 请假30天

代码解析

Request 类:封装请求内容和级别。
Handler 基类:定义处理请求的接口,并持有下一个处理者的指针。
​具体处理者 Manager、Director、CEO​:实现自己的处理逻辑,若无法处理则传递给下一个处理者。
​处理链:通过 setNext 方法动态构建处理链。


http://www.ppmy.cn/ops/166206.html

相关文章

【ESP32】ESP-IDF开发 | 经典蓝牙开发 | 蓝牙串口协议(SPP) + 客户端和服务端例程

1. 简介 相信我们最早接触蓝牙&#xff0c;就是在某宝上买一个小巧的蓝牙模块&#xff0c;接到单片机上&#xff0c;通过AT指令进行简单配置&#xff0c;就可以用手机连接该模块&#xff0c;然后远程发送信息给单片机。这里面用到的就是SPP协议&#xff08;Serial Port Protoco…

Python中很常用的100个函数整理

Python 内置函数提供了强大的工具&#xff0c;涵盖数据处理、数学运算、迭代控制、类型转换等。本文总结了 100 个常用内置函数&#xff0c;并配备示例代码&#xff0c;提高编程效率。 1. abs() 取绝对值 print(abs(-10)) # 10 2. all() 判断所有元素是否为真 print(all([…

【2025】基于python+django的慢性病健康管理系统(源码、万字文档、图文修改、调试答疑)

系统功能结构图如下 慢性病健康管理系统 课题背景 随着全球人口老龄化的加剧以及生活方式的改变&#xff0c;慢性病的发病率呈上升趋势&#xff0c;给个人健康和社会医疗资源带来了巨大压力。传统的慢性病管理模式存在信息不畅、患者参与度低、医疗资源分配不均等问题&#xf…

如何利用物理按键控制LVGL控件的大小与状态

​ lvgl可以利用物理按键控制控件的选择和状态&#xff0c;演示视频如下&#xff1a; 单物理按键控制LVGL控件的选择和状态 移植方法如下&#xff1a;1 在注册设备中&#xff0c;填写对应的变量和初始化函数。这里我们以移keypad为例&#xff0c;因为keypad的功能很多。 ![请添…

使用Fluent-bit将容器标准输入和输出的日志发送到Kafka

什么是fluent-bit&#xff1f; Fluent Bit 是一款开源的轻量级日志处理器与转发器&#xff0c;专为嵌入式系统、容器化环境及分布式架构设计。其核心功能包括日志收集、过滤、聚合和传输&#xff0c;支持多种输入源&#xff08;如文件、系统日志、HTTP接口&#xff09;和输出目…

解决电脑问题(8)——网络问题

电脑网络出现问题的原因较为复杂&#xff0c;以下是从网络连接、网络配置以及网络环境等方面的常见问题及解决方法&#xff1a; 网络连接问题 检查物理连接&#xff1a;对于有线网络&#xff0c;检查网线是否插好&#xff0c;网线有无破损、断裂等情况。对于无线网络&#xff…

每日一题---数组中两个字符串的最小距离

数组中两个字符串的最小距离 给定一个字符串数组strs&#xff0c;再给定两个字符串str1和str2&#xff0c;返回在strs中str1和str2的最小距离&#xff0c;如果str1或str2为null&#xff0c;或不在strs中&#xff0c;返回-1。 链接&#xff1a;数组中两个字符串的最小距离__牛…

GitHub 汉化插件,GitHub 中文化界面安装全教程_最新

概述 GitHub作为全球最大的代码托管平台&#xff0c;拥有庞大的用户群体。对于中文用户来说&#xff0c;如果能将GitHub界面汉化&#xff0c;将大大提高使用体验和工作效率。本文将详细介绍如何通过安装汉化插件&#xff0c;实现GitHub界面的中文化。 感谢maboloshi作者的无私奉…