0

0

C++责任链模式实现多级请求处理

P粉602998670

P粉602998670

发布时间:2025-09-03 09:55:01

|

528人浏览过

|

来源于php中文网

原创

责任链模式通过解耦请求发送者与处理者,使多个对象有机会处理请求,提升系统灵活性和可扩展性;每个处理者持有后继引用,若无法处理则传递给下一个,直至被处理或到达链尾;其优势在于降低耦合、支持动态调整处理链,但可能因链过长或配置不当影响性能或导致请求未被处理。

c++责任链模式实现多级请求处理

C++责任链模式的核心在于将请求的发送者和处理者解耦,允许多个对象有机会处理请求。每个对象(称为处理者)都持有下一个处理者的引用,如果一个处理者不能处理该请求,它会将请求传递给链中的下一个处理者。

解决方案

以下是一个C++责任链模式的简单实现,用于处理不同优先级的请求:

#include 
#include 

class Request {
public:
    enum Priority {
        LOW,
        MEDIUM,
        HIGH
    };

    Request(std::string description, Priority priority) : description_(description), priority_(priority) {}

    std::string getDescription() const { return description_; }
    Priority getPriority() const { return priority_; }

private:
    std::string description_;
    Priority priority_;
};

class Handler {
public:
    Handler() : nextHandler_(nullptr) {}
    virtual ~Handler() {}

    void setNext(Handler* next) {
        nextHandler_ = next;
    }

    virtual void handleRequest(Request& request) {
        if (nextHandler_) {
            nextHandler_->handleRequest(request);
        } else {
            std::cout << "End of chain reached. Request cannot be handled." << std::endl;
        }
    }

protected:
    Handler* nextHandler_;
};

class LowPriorityHandler : public Handler {
public:
    void handleRequest(Request& request) override {
        if (request.getPriority() == Request::Priority::LOW) {
            std::cout << "LowPriorityHandler handled request: " << request.getDescription() << std::endl;
        } else {
            std::cout << "LowPriorityHandler cannot handle request, passing to next handler." << std::endl;
            Handler::handleRequest(request);
        }
    }
};

class MediumPriorityHandler : public Handler {
public:
    void handleRequest(Request& request) override {
        if (request.getPriority() == Request::Priority::MEDIUM) {
            std::cout << "MediumPriorityHandler handled request: " << request.getDescription() << std::endl;
        } else {
            std::cout << "MediumPriorityHandler cannot handle request, passing to next handler." << std::endl;
            Handler::handleRequest(request);
        }
    }
};

class HighPriorityHandler : public Handler {
public:
    void handleRequest(Request& request) override {
        if (request.getPriority() == Request::Priority::HIGH) {
            std::cout << "HighPriorityHandler handled request: " << request.getDescription() << std::endl;
        } else {
            std::cout << "HighPriorityHandler cannot handle request, passing to next handler." << std::endl;
            Handler::handleRequest(request);
        }
    }
};

int main() {
    LowPriorityHandler lowHandler;
    MediumPriorityHandler mediumHandler;
    HighPriorityHandler highHandler;

    lowHandler.setNext(&mediumHandler);
    mediumHandler.setNext(&highHandler);

    Request lowRequest("Fix a minor typo", Request::Priority::LOW);
    Request mediumRequest("Update documentation", Request::Priority::MEDIUM);
    Request highRequest("Server is down!", Request::Priority::HIGH);
    Request unhandledRequest("Unknown issue", Request::Priority::LOW);

    lowHandler.handleRequest(lowRequest);
    lowHandler.handleRequest(mediumRequest);
    lowHandler.handleRequest(highRequest);

    //Demonstrates what happens if no handler can handle a request.  We'll change the priority of the unhandledRequest
    //and send it down the chain.
    //unhandledRequest = Request("Unknown issue", Request::Priority::HIGH);  //now a high priority request.
    //lowHandler.handleRequest(unhandledRequest);


    return 0;
}

责任链模式的优势是什么?

立即学习C++免费学习笔记(深入)”;

责任链模式的主要优势在于降低了对象之间的耦合度。客户端不需要知道哪个对象会处理请求,只需要将请求发送到链的第一个处理者。此外,可以动态地添加或删除处理者,从而灵活地改变处理请求的流程。 这对维护和扩展系统很有帮助。

uBrand
uBrand

一站式AI品牌创建平台,在线品牌设计,AI品牌策划,智能品牌营销;uBrand帮助创业者轻松打造个性品牌!

下载

如何选择合适的处理者顺序?

处理者顺序的选择取决于具体的业务需求。通常,应该将最有可能处理请求的处理者放在链的前面,以提高处理效率。 也可以根据请求的复杂性或优先级来决定处理者顺序。例如,在上述示例中,优先级较低的请求可以先被处理,避免占用高优先级处理者的资源。

责任链模式有哪些潜在的缺点?

责任链模式的一个潜在缺点是,如果链配置不当,可能会导致请求无法被处理。例如,如果所有处理者都无法处理某个类型的请求,该请求将会一直传递到链的末端,最终被丢弃。此外,责任链模式可能会降低系统的性能,因为每个请求都需要遍历整个链。因此,在使用责任链模式时,需要仔细考虑处理者顺序和请求处理逻辑,以避免这些问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.5万人学习

极致CMS零基础建站教学视频
极致CMS零基础建站教学视频

共62课时 | 5.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号