责任链模式通过请求在处理者链中传递实现解耦,c++中以抽象Handler定义接口,具体处理者继承并决定处理或转发请求,示例中主管、经理、总监按金额逐级审批,使用智能指针管理生命周期,支持动态构建链与多级处理,适用于审批流等场景。

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到某个处理者决定处理该请求。在C++中实现责任链模式,关键是定义一个抽象处理者类,并让具体处理者在链中依次尝试处理请求。
责任链模式的核心结构
责任链模式通常包含以下角色:
- Handler(抽象处理者):定义处理请求的接口,并持有下一个处理者的引用。
- ConcreteHandler(具体处理者):实现处理逻辑,判断是否处理当前请求,否则转发给下一节点。
- Client(客户端):创建处理链并发送请求。
基础C++实现示例
下面是一个简单的C++责任链实现,模拟审批流程:不同级别的管理者可以处理不同金额的报销申请。
#include <iostream> #include <memory> // 抽象处理者 class approver { protected: std::unique_ptr<Approver> next; std::string name; public: Approver(const std::string& n) : name(n) {} // 设置后继者 void setNext(std::unique_ptr<Approver> 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++免费学习笔记(深入)”;
int main() { // 构建责任链 auto supervisor = std::make_unique<Supervisor>(); auto manager = std::make_unique<Manager>(); auto director = std::make_unique<Director>(); 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++特性可写出清晰安全的代码。
基本上就这些。结构清晰,扩展性强,适合需要层级处理逻辑的系统。