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

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

链接: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;
}

http://www.kler.cn/a/458800.html

相关文章:

  • 接口测试Day04-postman生成测试报告ihrm项目
  • union的实际使用
  • Java 8 及经典面试题全解析
  • Android 系统 AlarmManager 系统层深度定制
  • 7-58 输出不重复的数组元素
  • Keil中的gcc
  • MySQL:一文弄懂时区time_zone
  • 远程调用服务器jupter调试程序
  • word运行时错误‘-2147221164(80040154)’ 没有注册类的解决办法
  • C++ 设计模式:备忘录模式(Memento Pattern)
  • omi friend实战记录
  • Java重要面试名词整理(十六):SpringBoot
  • 基于springboot的美容院管理系统设计与实现(java项目源码+文档)
  • 代码随想录Day37 动态规划:完全背包理论基础,518.零钱兑换II,本周小结动态规划,377. 组合总和 Ⅳ,70. 爬楼梯(进阶版)。
  • React Native中的核心技术概念
  • 【GridView渐进全解】第一部分GridView基础
  • 前端参数formData格式
  • 扬声器阵列的波束成形相关的关键技术和国内外研究现状
  • 未授权访问漏洞
  • AF3 AtomTransformerBlock类解读
  • SpringBoot数据字典字段自动生成对应code和desc
  • 硬件设计-硬件 EMC 设计规范
  • Day62 图论part11
  • 【每日学点鸿蒙知识】ets匿名类、获取控件坐标、Web显示iframe标签、软键盘导致上移、改变Text的背景色
  • 【Node】什么是Node,及基础使用
  • redis用途都有哪些