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

责任链模式(C++)

定义:责任链模式(Chain of Responsibility)是一种行为设计模式,它允许你将请求沿着处理者链进行传递。每个处理者都有机会处理请求,如果某个处理者不能处理该请求,则可以将请求传递给链中的下一个处理者。这个模式使得你可以在不修改现有代码结构的情况下,动态地添加或删除处理者,并且可以将请求和处理者解耦,使得请求可以发送给一系列的处理者而无需关心哪个处理者会实际处理它。

        代码:

// 抽象处理者  
class Handler {  
public:  virtual ~Handler() = default;  // 设置下一个处理者  void setNext(std::shared_ptr<Handler> next) {  this->nextHandler = next;  }  // 处理请求  void handleRequest(const std::string& request) {  if (canHandle(request)) {  handle(request);  } else if (nextHandler) {  nextHandler->handleRequest(request);  } else {  std::cout << "No handler could process the request: " << request << std::endl;  }  }  protected:  // 判断是否能处理请求  virtual bool canHandle(const std::string& request) const = 0;  // 处理请求的具体实现  virtual void handle(const std::string& request) = 0;  private:  std::shared_ptr<Handler> nextHandler;  
};  // 具体处理者A  
class ConcreteHandlerA : public Handler {  
protected:  bool canHandle(const std::string& request) const override {  return request == "RequestA";  }  void handle(const std::string& request) override {  std::cout << "ConcreteHandlerA handled request: " << request << std::endl;  }  
};  // 具体处理者B  
class ConcreteHandlerB : public Handler {  
protected:  bool canHandle(const std::string& request) const override {  return request == "RequestB";  }  void handle(const std::string& request) override {  std::cout << "ConcreteHandlerB handled request: " << request << std::endl;  }  
};  int main() {  // 创建处理者  auto handlerA = std::make_shared<ConcreteHandlerA>();  auto handlerB = std::make_shared<ConcreteHandlerB>();  // 设置职责链  handlerA->setNext(handlerB);  // 发送请求  handlerA->handleRequest("RequestA"); // ConcreteHandlerA handled request: RequestA  handlerA->handleRequest("RequestB"); // ConcreteHandlerB handled request: RequestB  handlerA->handleRequest("RequestC"); // No handler could process the request: RequestC  return 0;  
}


http://www.mrgr.cn/news/49257.html

相关文章:

  • 桥接模式(C++)
  • 架构设计笔记-12-信息系统架构设计理论与实践
  • Vue学习笔记
  • Claude 账号被封怎么办?被封的原因有哪些?国内不怕封号的方法
  • vue3集成electron
  • 如何在UE5中创建加载屏幕(开场动画)?
  • 如何进行JVM的调优
  • 如何通过 Nginx 只允许 www 域名访问并禁止裸域名访问
  • NVIDIA Bluefield DPU上的启动流程4个阶段分别是什么?作用是什么?
  • 400行程序写一个实时操作系统(四):观察运行中的Sparrow
  • Mapstruct的使用备忘【代替BeanUtils高效率属性拷贝】
  • 浅谈Java之UDP通信
  • 【解决】Win10右键“打开文件所在位置”报错“该文件没有与之关联的应用来执行该操作...”
  • 被装物联网系统|DW-S305系统是一套成熟系统
  • Cortex-M 内核的 OS 特性
  • 邮票鉴赏系统| 邮票鉴赏系统平台|基于java和vue的邮票鉴赏系统设计与实现(源码+数据库+文档)
  • 新手入门怎么炒股,新手炒股入门需要做哪些准备?
  • S4.2.6.2 LTSSM 之 Polling 状态
  • FPGA实现PCIE采集电脑端视频缩放后转千兆UDP网络输出,基于XDMA+PHY芯片架构,提供3套工程源码和技术支持
  • 宏基因组分析软件