当前位置: 首页 > news >正文

C++ 设计模式:职责链模式(Chain of Responsibility)

链接:C++ 设计模式
链接:C++ 设计模式 - 组合模式
链接:C++ 设计模式 - 迭代器模式

职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这些对象通过形成一条链来传递请求,直到有一个对象处理它为止。

1. 问题分析

在开发中,我们经常遇到需要将请求发送给多个处理对象的情况。传统的做法是将所有处理逻辑集中在一个对象中,这样会导致代码复杂且难以维护。

职责链模式通过将请求的处理职责分散到多个对象中,每个对象都包含对下一个对象的引用,从而形成一条链。请求沿着这条链传递,直到有一个对象处理它为止。

2.实现步骤

  1. 定义处理者接口(Handler):声明处理请求的方法,并包含对下一个处理者的引用。
  2. 实现具体处理者类(ConcreteHandler):实现处理者接口,处理它所负责的请求,或将请求传递给下一个处理者。
  3. 客户端代码(Client):创建处理者链,并向链上的处理者对象提交请求。

3.代码示例

3.1.定义处理者接口

class Handler {public:virtual ~Handler() = default;void setNextHandler(Handler* next) { nextHandler_ = next; }virtual void handleRequest(const std::string& request) = 0;protected:Handler* nextHandler_ = nullptr;
};

3.2.实现具体处理者类

// 具体处理者类1
class ConcreteHandler1 : public Handler {public:void handleRequest(const std::string& request) override {if (request == "Low") {std::cout << "ConcreteHandler1 handled the request: " << request << std::endl;} else if (nextHandler_) {nextHandler_->handleRequest(request);}}
};
// 具体处理者类2
class ConcreteHandler2 : public Handler {public:void handleRequest(const std::string& request) override {if (request == "Medium") {std::cout << "ConcreteHandler2 handled the request: " << request << std::endl;} else if (nextHandler_) {nextHandler_->handleRequest(request);}}
};
// 具体处理者类3
class ConcreteHandler3 : public Handler {public:void handleRequest(const std::string& request) override {if (request == "High") {std::cout << "ConcreteHandler3 handled the request: " << request << std::endl;} else if (nextHandler_) {nextHandler_->handleRequest(request);}}
};

3.3.客户端代码

int main() {// 创建处理者对象ConcreteHandler1 handler1;ConcreteHandler2 handler2;ConcreteHandler3 handler3;// 设置处理者链handler1.setNextHandler(&handler2);handler2.setNextHandler(&handler3);// 提交请求handler1.handleRequest("Low");handler1.handleRequest("Medium");handler1.handleRequest("High");handler1.handleRequest("Unknown");return 0;
}

4.总结

  1. 优点
    • 降低耦合度:请求的发送者和接收者解耦。
    • 增强灵活性:可以动态地添加或修改处理者链。
    • 责任分担:每个处理者只需处理自己负责的部分。
  2. 缺点
    • 调试困难:由于请求的处理是沿链传递的,调试时可能需要跟踪多个处理者。
    • 性能问题:如果链条过长,可能会影响性能。
http://www.lryc.cn/news/514660.html

相关文章:

  • Yocto项目 - 详解PACKAGECONFIG机制
  • Linux下部署ElasticSearch集群
  • 超高分辨率 图像 分割处理
  • 【含文档+PPT+源码】基于springboot的农贸菜市场租位管理系统的设计与实现
  • 信息科技伦理与道德1:绪论
  • Linux实验报告15-添加系统调用
  • logback之配置文件使用详解
  • 壁纸样机神器,这个工具适合专业设计师用吗?
  • MySQL秘籍之索引与查询优化实战指南
  • 【AI日记】25.01.03 kaggle 比赛 3-2 未来的命运
  • Linux(Centos 7.6)命令详解:ls
  • 【Unity3D】UGUI Canvas画布渲染流程
  • minikube安装k8s
  • Docker图形化界面工具Portainer最佳实践
  • 借助 FinClip 跨端技术探索鸿蒙原生应用开发之旅
  • 【网络】ARP表、MAC表、路由表
  • Linux驱动开发学习准备(Linux内核源码添加到工程-Workspace)
  • 25.1.3
  • Leecode刷题C语言之我的日程安排表②
  • 十二、Vue 路由
  • smell---Paddle-DI
  • PCL点云库入门——PCL库点云特征之点云法向量(NormalEstimation)及其可视化
  • 25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)
  • Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测
  • Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能
  • Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验
  • DVWA靶场Open HTTP Redirect (重定向) 漏洞所有级别通关教程及源码审计
  • 探索 JMeter While Controller:循环测试的奇妙世界
  • Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace
  • ubuntu支持ssh