责任链模式是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。为了更好地理解这一点,我们可以通过一个生活中的实际例子来解释。
例子:公司请假审批流程
假设你在一家公司工作,你需要请假。公司的请假审批流程是一个很好的责任链模式的例子。这个流程可能包括以下几个步骤:
- 员工填写请假申请:你作为员工填写请假申请。
- 直接主管审批:你的直接主管会首先查看并审批你的请假申请。
- 部门经理审批:如果请假天数较多,直接主管可能无法单独做决定,需要部门经理进一步审批。
- 人力资源部门审批:如果请假天数超过一定天数,可能还需要人力资源部门的最终审批。
在这个流程中,每一个审批步骤都是一个处理请求的对象,这些对象被串成一条链,依次处理你的请假申请。
责任链的实现
- 员工提交请假申请:你提交请假申请,这个请求被传递到链条的第一个处理者——直接主管。
- 直接主管处理请求:
- 如果请假天数较少(例如1-2天),直接主管可以直接批准请求。
- 如果请假天数较多(例如超过2天),直接主管会将请求传递给下一个处理者——部门经理。
- 部门经理处理请求:
- 如果请假天数在部门经理的权限范围内(例如3-5天),部门经理可以批准请求。
- 如果请假天数超过部门经理的权限(例如超过5天),部门经理会将请求传递给下一个处理者——人力资源部门。
- 人力资源部门处理请求:人力资源部门会根据公司的政策和规定,最终决定是否批准你的请假申请。
代码示例
为了进一步说明这个过程,我们可以用C++代码来模拟这个责任链模式:
#include <iostream>
#include <string>
// 抽象处理者
class Approver {
protected:
Approver* nextApprover;
public:
Approver() : nextApprover(nullptr) {}
void setNextApprover(Approver* approver) {
nextApprover = approver;
}
virtual void processRequest(int days) = 0; // 纯虚函数
};
// 具体处理者:直接主管
class Supervisor : public Approver {
public:
void processRequest(int days) override {
if (days <= 2) {
std::cout << "Supervisor approves " << days << " days leave." << std::endl;
} else if (nextApprover != nullptr) {
nextApprover->processRequest(days);
}
}
};
// 具体处理者:部门经理
class Manager : public Approver {
public:
void processRequest(int days) override {
if (days <= 5) {
std::cout << "Manager approves " << days << " days leave." << std::endl;
} else if (nextApprover != nullptr) {
nextApprover->processRequest(days);
}
}
};
// 具体处理者:人力资源部门
class HR : public Approver {
public:
void processRequest(int days) override {
if (days > 5) {
std::cout << "HR approves " << days << " days leave." << std::endl;
} else if (nextApprover != nullptr) {
nextApprover->processRequest(days);
}
}
};
int main() {
// 创建处理者对象
Supervisor supervisor;
Manager manager;
HR hr;
// 设置责任链
supervisor.setNextApprover(&manager);
manager.setNextApprover(&hr);
// 提交请假申请
int leaveDays = 6;
supervisor.processRequest(leaveDays);
return 0;
}
解释
- 抽象处理者(Approver):定义了处理请求的接口和设置下一个处理者的方法。
- 具体处理者(Supervisor, Manager, HR):实现了处理请求的具体逻辑。
- 责任链的设置:通过
setNextApprover
方法将处理者串成一条链。 - 请求的处理:从链的第一个处理者开始处理请求,如果当前处理者无法处理,则将请求传递给下一个处理者。
通过这个例子,我们可以看到责任链模式是如何在实际应用中避免请求发送者和接收者的耦合,并且灵活地处理请求。