职责链模式 -- C++
2021/12/20 1:20:31
本文主要是介绍职责链模式 -- C++,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。
- 目的:对请求的发送者和接受者进行解耦。
- 属于:“对象行为型模式”。
示例
#ifndef DESIGNEPATTERNS_REQUEST_H #define DESIGNEPATTERNS_REQUEST_H #include <iostream> #include <string> enum class RequestType { REQ_HAN1, REQ_HAN2, REQ_HAN3 }; class Request { public: Request(const std::string &desc, RequestType type) : description(desc), requesttype(type) {} virtual ~Request() {} RequestType getRequesttype() const { return requesttype; } const std::string &getDescription() const { return description; } private: std::string description; RequestType requesttype; }; #endif //DESIGNEPATTERNS_REQUEST_H
#ifndef DESIGNEPATTERNS_HANDLER_H #define DESIGNEPATTERNS_HANDLER_H #include "Request.h" class Handler { public: Handler() { m_nextHandler = nullptr; } /** * 设置下一个节点 * @param next */ void setNextHandler(Handler *next) { m_nextHandler = next; } /** * 处理函数,如果能处理则处理当前节点,若不能处理给下一个节点 * @param req */ void handle(const Request req) { if (canHandleReq(req)) processReq(req); else sendToNextHandler(req); } protected: virtual bool canHandleReq(const Request &req) = 0; // ① virtual void processReq(const Request &req) = 0; // ② private: Handler *m_nextHandler; // 下一个指针 /** * 发送给下一个节点处理 * @param req */ void sendToNextHandler(const Request &req) { if (m_nextHandler != nullptr) m_nextHandler->handle(req); } }; #endif //DESIGNEPATTERNS_HANDLER_H
#ifndef DESIGNEPATTERNS_HANDLE1_H #define DESIGNEPATTERNS_HANDLE1_H #include "handler.h" class Handle1 : public Handler { protected: bool canHandleReq(const Request &req) override { return RequestType::REQ_HAN1 == req.getRequesttype(); } void processReq(const Request &req) override { std::cout << "Handle1::processReq: " << req.getDescription() << std::endl; } }; #endif //DESIGNEPATTERNS_HANDLE1_H
#ifndef DESIGNEPATTERNS_HANDLE2_H #define DESIGNEPATTERNS_HANDLE2_H #include "handler.h" class Handle2 : public Handler { protected: bool canHandleReq(const Request &req) override { return RequestType::REQ_HAN2 == req.getRequesttype(); } void processReq(const Request &req) override { std::cout << "Handle2::processReq: " << req.getDescription() << std::endl; } }; #endif //DESIGNEPATTERNS_HANDLE2_H
#ifndef DESIGNEPATTERNS_HANDLE3_H #define DESIGNEPATTERNS_HANDLE3_H #include "handler.h" class Handle3 : public Handler { protected: bool canHandleReq(const Request &req) override { return RequestType::REQ_HAN3 == req.getRequesttype(); } void processReq(const Request &req) override { std::cout << "Handle3::processReq: " << req.getDescription() << std::endl; } }; #endif //DESIGNEPATTERNS_HANDLE3_H
#ifndef DESIGNEPATTERNS_INCLIB_H #define DESIGNEPATTERNS_INCLIB_H #include "handle1.h" #include "handle2.h" #include "handle3.h" void CORTest() { Handler *h1 = new Handle1(); Handler *h2 = new Handle2(); Handler *h3 = new Handle3(); h1->setNextHandler(h2); h2->setNextHandler(h3); Request req("meimei", RequestType::REQ_HAN2); h1->handle(req); } #endif //DESIGNEPATTERNS_INCLIB_H
#include <iostream> #include "ChainOfResponsibility/incLib.h" int main() { // ChainOfResponsibility test CORTest(); return 0; }
结果
这篇关于职责链模式 -- C++的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享