跳转到主内容
极星编程网:以代码为星,赴技术山海!

C++怎么实现一个责任链模式_C++设计模式与责任链模式实现

责任链模式通过请求在处理者链中传递实现解耦,C++中以抽象Handler定义接口,具体处理者继承并决定处理或转发请求,示例中主管、经理、总监按金额逐级审批,使用智能指针管理生命周期,支持动态构建链与多级处理,适用于审批流等场景。 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到某个处理者决定处理该请求。在C++中实现责任链模式,关键是定义一个抽象处理者类,并让具体处理者在链中依次尝试处理请求。 责任链模式的核心结构 责任链模式通常包含以下角色: Handler(抽象处理者) :定义处理请求的接口,并持有下一个处理者的引用。 ConcreteHandler(具体处理者) :实现处理逻辑,判断是否处理当前请求,否则转发给下一节点。 Client(客户端) :创建处理链并发送请求。 基础C++实现示例 下面是一个简单的C++责任链实现,模拟审批流程:不同级别的管理者可以处理不同金额的报销申请。
#include #include // 抽象处理者 class Approver { protected: std::unique_ptr next; std::string name; public: Approver(const std::string& n) : name(n) {} // 设置后继者 void setNext(std::unique_ptr nextApprover) { next = std::move(nextApprover); } // 处理请求 virtual void processRequest(double amount) = 0; // 转发请求到下一级 void passToNext(double amount) { if (next) { next->processRequest(amount); } else { std::cout << "No one can approve the request for $" << amount << "\n"; } } }; // 具体处理者:主管 class Supervisor : public Approver { public: Supervisor() : Approver("Supervisor") {} void processRequest(double amount) override { if (amount <= 1000) { std::cout << name << " approves request for $" << amount << "\n"; } else { std::cout << name << " cannot handle $" << amount << ", passing to next...\n"; passToNext(amount); } } }; // 具体处理者:经理 class Manager : public Approver { public: Manager() : Approver("Manager") {} void processRequest(double amount) override { if (amount <= 5000) { std::cout << name << " approves request for $" << amount << "\n"; } else { std::cout << name << " cannot handle $" << amount << ", passing to next...\n"; passToNext(amount); } } }; // 具体处理者:总监 class Director : public Approver { public: Director() : Approver("Director") {} void processRequest(double amount) override { if (amount <= 20000) { std::cout << name << " approves request for $" << amount << "\n"; } else { std::cout << name << " cannot handle $" << amount << ", escalating...\n"; passToNext(amount); } } };
使用示例: 立即学习 “ C++免费学习笔记(深入) ”; C函数速查手册(CHM版) C函数速查手册(CHM版) 下载
int main() { // 构建责任链 auto supervisor = std::make_unique(); auto manager = std::make_unique(); auto director = std::make_unique(); supervisor->setNext(std::move(manager)); supervisor->next->setNext(std::move(director)); // 发送请求 supervisor->processRequest(500); // 主管处理 supervisor->processRequest(3000); // 经理处理 supervisor->processRequest(15000); // 总监处理 supervisor->processRequest(25000); // 无人处理 return 0; }
关键点说明与优化建议 这个模式的优势在于解耦请求发送者和接收者。你可以根据实际需求扩展功能: 使用智能指针避免内存泄漏,如示例中的
std::unique_ptr
。 可在运行时动态构建链,比如从 配置文件 读取处理顺序。 某些场景下允许多个处理者参与(不中断链),可移除条件判断后的中断逻辑。 添加日志或审计功能,在每个处理者中记录操作。 责任链适用于审批流、事件处理、过滤器链等场景。C++中通过虚函数和多态实现灵活性,结合现代C++特性可写出清晰安全的代码。 基本上就这些。结构清晰,扩展性强,适合需要层级处理逻辑的系统。

相关文章