目录
责任链模式(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