【C++】责任链模式
目录
- 一、模式核心概念与结构
- 二、C++ 实现示例:员工请假审批系统
- 三、责任链模式的关键特性
- 四、应用场景
- 五、责任链模式与其他设计模式的关系
- 六、C++ 标准库中的责任链模式应用
- 七、优缺点分析
- 八、实战案例:Web 请求过滤器链
- 九、实现注意事项
- 如果这篇文章对你有所帮助,渴望获得你的一个点赞!
责任链模式(Chain of Responsibility Pattern)是一种【行为型】设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求为止。这种模式将请求的发送者和接收者解耦,使得多个处理者都有机会处理请求,而无需客户端直接知道具体的处理者。
一、模式核心概念与结构
责任链模式包含三个核心角色:
- 抽象处理者(Handler):定义处理请求的接口,通常包含一个指向下一个处理者的引用。
- 具体处理者(Concrete Handler):实现抽象处理者接口,处理请求或转发给下一个处理者。
- 客户端(Client):创建处理者链并向链头发送请求。
二、C++ 实现示例:员工请假审批系统
以下是一个经典的责任链模式示例,演示如何用责任链处理不同级别的请假申请:
#include <iostream>
#include <string>
#include <memory>// 抽象处理者:管理者
class Manager {
protected:std::shared_ptr<Manager> nextManager; // 指向下一个处理者public:virtual ~Manager() = default;// 设置下一个处理者void setNextManager(std::shared_ptr<Manager> manager) {nextManager = manager;}// 处理请求的接口virtual void handleRequest(int days) const = 0;
};// 具体处理者:主管
class Supervisor : public Manager {
public:void handleRequest(int days) const override {if (days <= 3) {std::cout << "Supervisor approved " << days << " days leave" << std::endl;} else if (nextManager) {nextManager->handleRequest(days);} else {std::cout << "Request for " << days << " days cannot be handled" << std::endl;}}
};// 具体处理者:经理
class Manager : public Manager {
public:void handleRequest(int days) const override {if (days <= 10) {std::cout << "Manager approved " << days << " days leave" << std::endl;} else if (nextManager) {nextManager->handleRequest(days);} else {std::cout << "Request for " << days << " days cannot be