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

13 责任链(Chain of Responsibility)模式

责任链模式

1.1 分类

(对象)行为型

1.2 提出问题

开发一款故障报修系统,不同的业务员处理的故障不同,如何确保客户的维修请求得到妥善的处理。

1.3 解决方案

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

1.4 实现类图

在这里插入图片描述

  1. 处理者(Handler)声明了所有具体处理者的通用接口。
  2. 基础处理者(Base Handler)是一个可选的类,你可以将所有处理者共用的样本代码放置在其中。
  3. 具体处理者(Concrete Handlers)包含处理请求的实际代码。 每个处理者接收到请求后,都必须决定是否进行处理,以及是否沿着链传递请求。
  4. 客户端(Client)可根据程序逻辑一次性或者动态地生成链请求可发送给链上的任意一个处理者。

1.5 示例代码

#include <iostream>
#include <string>
#include <list>

//class Handler {
//public:
//    virtual Handler* setNext(Handler* handler) = 0;
//    virtual std::string handle(std::string request) = 0;
//};

class BaseHandler/*:public Handler*/{
private:
    BaseHandler* m_nextHandler;
public:
    BaseHandler* setNext(BaseHandler* handler) {
        m_nextHandler = handler;
        return m_nextHandler;
    }
    virtual std::string handle(std::string request) {
        if (m_nextHandler) {
            return m_nextHandler->handle(request);
        }
        return "";
    }
};

class RobotAI : public BaseHandler {
public:
    std::string handle(std::string request) override {
        if (request == "使用向导") {
            return "RobotAI:我来处理-" + request + "-。\n";
        } else {
            return BaseHandler::handle(request);
        }
    }
};
class TelOperator : public BaseHandler {
public:
    std::string handle(std::string request) override {
        if (request == "常见问题") {
            return "TelOperator:我来处理-" + request + "-。\n";
        } else {
            return BaseHandler::handle(request);
        }
    }
};
class Expert : public BaseHandler {
public:
    std::string handle(std::string request) override {
        if (request == "疑难杂症") {
            return "Expert:我来处理-" + request + "-。\n";
        } else {
            return BaseHandler::handle(request);
        }
    }
};

void clientCode(BaseHandler& handler) {
    std::list<std::string> problems = { "疑难杂症","常见问题","使用向导","常见问题","扯淡的问题" };
    for (const std::string& problem : problems) {
        std::string result = handler.handle(problem);
        std::cout << "Client:谁来处理" << problem<<":\n";
        if (result.empty()) {
            std::cout << "处理结果:" << "没人能够处理。\n";
        } else {
            std::cout << "处理结果:" << result;
        }
    }
}
int main()
{
    RobotAI robot;
    TelOperator telOperator;
    Expert expert;
    robot.setNext(&telOperator)->setNext(&expert);
    std::cout << "Chain:机器人AI->话务员->专家\n";
    clientCode(robot);

    //clientCode(telOperator);
}

1.6 举个栗子

责任链模式负责为活动的 GUI 元素显示上下文帮助信息。
在这里插入图片描述

1.7 总结

1.7.1 优点

  1. 你可以控制请求处理的顺序。
  2. 单一职责原则。你可对发起操作和执行操作的类进行解耦。
  3. 开闭原则。你可以在不更改现有代码的情况下在程序中新增处理者。

1.7.2 缺点

部分请求可能未被处理。

相关文章:

  • 数据结构与算法-哈希表
  • resultMap 标签
  • 变相提高大模型上下文长度-RAG文档压缩-2.带早停机制的map-refine
  • pgsql用户和权限管理
  • 安卓基础(持续更新的笔记)
  • Kotlin Lambda
  • 2025年,如何选择IT监控平台
  • CEF132 编译指南 Linux 篇 - CEF 编译实战:构建 CEF(六)
  • 【Redis】下载安装Redis和Redis图形化界面工具教程(2024最新版本,史上最详细)
  • 石子合并
  • windows编译使用gtest
  • SpringBoot3 快速启动框架
  • VS2022中.Net Api + Vue 从创建到发布到IIS
  • Redis的常见数据结构
  • 内容中台驱动企业CMS架构优化与高效策略
  • springCloud-2021.0.9 之 GateWay 示例
  • Android Studio 打包App问题
  • 从0开始的操作系统手搓教程 4:做好准备,跳到加载器(Loader)
  • Word中设置表格在同一页
  • 深入解析SVG图片原理:从基础到高级应用
  • 教育部、国家发改委联合启动实施教师教育能力提升工程
  • 李公明︱一周书记:浪漫主义为什么……仍然重要?
  • 新华时评:任凭风云变幻,中俄关系从容前行
  • 江西浮梁县县长张汉坤被查,此前已有4个月无公开活动
  • 经济日报头版刊文:为什么贸易战没有出路
  • 上海畅通“外转内”,外贸优品成“香饽饽”