1. 责任链模式深度解析
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。这些处理对象被连接成一条链,请求沿着这条链传递,直到有一个对象处理它为止。
1.1 模式核心思想
责任链模式的核心在于构建一条处理链,每个处理节点都有机会处理请求,但也可以选择将请求传递给链中的下一个节点。这种设计带来了几个显著优势:
- 解耦发送者和接收者:发送者不需要知道具体由哪个对象处理请求
- 动态调整处理流程:可以运行时动态改变处理链的顺序或成员
- 单一职责原则:每个处理器只需关注自己能处理的请求类型
- 开放封闭原则:可以方便地新增处理器而不影响现有代码
提示:责任链模式特别适合处理那些需要多级审批、分层次处理或存在多种可能处理方式的场景。
1.2 模式结构解析
一个标准的责任链模式通常包含以下角色:
- Handler(抽象处理者):定义处理请求的接口,通常包含处理方法和设置后继者的方法
- ConcreteHandler(具体处理者):实现具体的请求处理方法,判断是否有能力处理该请求,如果可以则处理,否则转发给后继者
- Client(客户端):创建处理链,并向链头的具体处理者提交请求
在C++实现中,通常会使用抽象基类定义Handler接口,然后通过指针或引用连接各个处理者形成链条。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 责任链模式实现详解
2.1 基础实现模板
让我们先看一个最基础的责任链模式C++实现框架:
cpp复制#include <iostream>
using namespace std;
// 请求类型枚举
enum RequestType {
LEAVE, // 请假
RAISE, // 加薪
QUIT // 离职
};
// 抽象处理者
class AbstractManager {
protected:
AbstractManager* _next; // 后继处理者
public:
virtual void handleRequest(RequestType rt) = 0;
void setNext(AbstractManager* am) { _next = am; }
virtual ~AbstractManager() {} // 虚析构函数
};
// 具体处理者:直属领导
class DirectLeader : public AbstractManager {
public:
void handleRequest(RequestType rt) override {
if (rt == LEAVE) {
cout << "直属领导批准了请假申请" << endl;
}
else if (_next != nullptr) {
cout << "直属领导无权处理,转交给上级..." << endl;
_next->handleRequest(rt);
}
else {
cout << "请求未被任何处理者处理" << endl;
}
}
};
// 具体处理者:部门经理
class DepartmentManager : public AbstractManager {
public:
void handleRequest(RequestType rt) override {
if (rt == RAISE) {
cout << "部门经理批准了加薪申请" << endl;
}
else if (_next != nullptr) {
cout << "部门经理无权处理,转交给上级..." << endl;
_next->handleRequest(rt);
}
else {
cout << "请求未被任何处理者处理" << endl;
}
}
};
// 具体处理者:总经理
class GeneralManager : public AbstractManager {
public:
void handleRequest(RequestType rt) override {
if (rt == QUIT) {
cout << "总经理处理了离职申请" << endl;
}
else if (_next != nullptr) {
cout << "总经理无权处理,转交给上级..." << endl;
_next->handleRequest(rt);
}
else {
cout << "请求未被任何处理者处理" << endl;
}
}
};
2.2 链式构建与使用
构建处理链并使用的典型方式如下:
cpp复制int main() {
// 创建处理者实例
DirectLeader* leader = new DirectLeader();
DepartmentManager* manager = new DepartmentManager
