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

打印 上一主题 下一主题

主题 1406|帖子 1406|积分 4218

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
链接:C++ 计划模式
链接:C++ 计划模式 - 组合模式
链接:C++ 计划模式 - 迭代器模式
职责链模式(Chain of Responsibility Pattern)是一种行为型计划模式,它允很多个对象都有机会处置惩罚请求,从而避免请求的发送者和吸收者之间的耦合。这些对象通过形成一条链来传递请求,直到有一个对象处置惩罚它为止。
1. 问题分析

开发中,我们经常遇到需要将请求发送给多个处置惩罚对象的情况。传统的做法是将所有处置惩罚逻辑会合在一个对象中,这样会导致代码复杂且难以维护。
职责链模式通过将请求的处置惩罚职责分散到多个对象中,每个对象都包含对下一个对象的引用,从而形成一条链。请求沿着这条链传递,直到有一个对象处置惩罚它为止。
2.实现步骤


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

3.1.定义处置惩罚者接口

  1. class Handler {
  2. public:
  3.   virtual ~Handler() = default;
  4.   void setNextHandler(Handler* next) { nextHandler_ = next; }
  5.   virtual void handleRequest(const std::string& request) = 0;
  6. protected:
  7.   Handler* nextHandler_ = nullptr;
  8. };
复制代码
3.2.实现详细处置惩罚者类

  1. // 具体处理者类1
  2. class ConcreteHandler1 : public Handler {
  3. public:
  4.   void handleRequest(const std::string& request) override {
  5.     if (request == "Low") {
  6.       std::cout << "ConcreteHandler1 handled the request: " << request << std::endl;
  7.     } else if (nextHandler_) {
  8.       nextHandler_->handleRequest(request);
  9.     }
  10.   }
  11. };
复制代码
  1. // 具体处理者类2
  2. class ConcreteHandler2 : public Handler {
  3. public:
  4.   void handleRequest(const std::string& request) override {
  5.     if (request == "Medium") {
  6.       std::cout << "ConcreteHandler2 handled the request: " << request << std::endl;
  7.     } else if (nextHandler_) {
  8.       nextHandler_->handleRequest(request);
  9.     }
  10.   }
  11. };
复制代码
  1. // 具体处理者类3
  2. class ConcreteHandler3 : public Handler {
  3. public:
  4.   void handleRequest(const std::string& request) override {
  5.     if (request == "High") {
  6.       std::cout << "ConcreteHandler3 handled the request: " << request << std::endl;
  7.     } else if (nextHandler_) {
  8.       nextHandler_->handleRequest(request);
  9.     }
  10.   }
  11. };
复制代码
3.3.客户端代码

  1. int main() {
  2.   // 创建处理者对象
  3.   ConcreteHandler1 handler1;
  4.   ConcreteHandler2 handler2;
  5.   ConcreteHandler3 handler3;
  6.   // 设置处理者链
  7.   handler1.setNextHandler(&handler2);
  8.   handler2.setNextHandler(&handler3);
  9.   // 提交请求
  10.   handler1.handleRequest("Low");
  11.   handler1.handleRequest("Medium");
  12.   handler1.handleRequest("High");
  13.   handler1.handleRequest("Unknown");
  14.   return 0;
  15. }
复制代码
4.总结


  • 长处

    • 低落耦合度:请求的发送者和吸收者解耦。
    • 加强灵活性:可以动态地添加或修改处置惩罚者链。
    • 责任分担:每个处置惩罚者只需处置惩罚自己负责的部门。

  • 缺点

    • 调试困难:由于请求的处置惩罚是沿链传递的,调试时大概需要跟踪多个处置惩罚者。
    • 性能问题:如果链条过长,大概会影响性能。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表