在职场中,请假流程大家都再熟悉不过:申请 1 至 2 天的假期,只需直属主管审批即可;若要请假 3 至 5 天,就需部门负责人进行复核;而超过 5 天的假期申请,则必须由总经理最终定夺。要是遇到超长假期,甚至得上报至总裁或董事长那里。这种层层递进的审批机制,宛如一套设计精妙的权限传递系统:每位处理者只能在自己的职权范围内行使决策权,一旦请求超出了当前处理者的能力范围,便会依照既定的权力链条自动流转,直至抵达具备相应权限的决策节点。
这一场景,其实是软件设计模式里经典的责任链模式(Chain of Responsibility Pattern) 在现实世界中的生动呈现。责任链模式通过搭建动态的处理链路,让多个对象都有机会对请求进行处理。这种方式巧妙地实现了请求发起者与处理者之间的解耦,同时也赋予了系统处理逻辑出色的灵活性与扩展性。
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。当请求到达链中的某个处理者时,该处理者会决定是处理这个请求还是将其传递给链中的下一个处理者。这样就形成了一条责任链,请求在这条链上依次传递,直到有一个处理者能够处理它为止。
我们以引言中的例子编写示例代码
#include
#include
#include
// 请假请求对象
class LeaveRequest {
public:
int days;
std::string name;
LeaveRequest(int d, const std::string& n) : days(d), name(n) {}
};
// 抽象处理者
class Handler {
protected:
std::unique_ptr successor; // 下一级处理者
const std::string title; // 职位名称
public:
explicit Handler(const std::string& t) : title(t) {}
virtual ~Handler() = default;
// 设置下一级处理者
void setSuccessor(std::unique_ptr next) {
successor = std::move(next);
}
// 处理请求的抽象方法
virtual void processRequest(const LeaveRequest& req) = 0;
protected:
// 默认传递行为
void delegateRequest(const LeaveRequest& req) {
if (successor) {
successor->processRequest(req);
} else {
std::cout << "⚠️ " << req.name << "的" << req.days
<< "天假期申请需要更高权限审批" << std::endl;
}
}
};
// 具体处理者:直属主管
class Supervisor : public Handler {
public:
Supervisor() : Handler("直属主管") {}
void processRequest(const LeaveRequest& req) override {
if (req.days <= 2) {
std::cout << "✅ [" << title << "] 批准" << req.name
<< "的" << req.days << "天假期" << std::endl;
} else {
std::cout << "➡️ [" << title << "] 将" << req.name
<< "的申请递交给上级" << std::endl;
delegateRequest(req);
}
}
};
// 具体处理者:部门负责人
class DepartmentManager : public Handler {
public:
DepartmentManager() : Handler("部门负责人") {}
void processRequest(const LeaveRequest& req) override {
if (req.days <= 5) {
std::cout << "✅ 【" << title << "】批准" << req.name
<< "的" << req.days << "天假期" << std::endl;
} else {
std::cout << "➡️ 【" << title << "】将" << req.name
<< "的申请递交给上级" << std::endl;
delegateRequest(req);
}
}
};
// 具体处理者:总经理
class GeneralManager : public Handler {
public:
GeneralManager() : Handler("总经理") {}
void processRequest(const LeaveRequest& req) override {
if (req.days <= 15) {
std::cout << "✅ 【★" << title << "★】批准" << req.name
<< "的" << req.days << "天假期" << std::endl;
} else {
std::cout << "➡️ 【★" << title << "★】将" << req.name
<< "的申请递交给上级" << std::endl;
delegateRequest(req);
}
}
};
// 具体处理者:董事长
class Chairman : public Handler {
public:
Chairman() : Handler("董事长") {}
void processRequest(const LeaveRequest& req) override {
std::cout << "✅ 【最高决议】" << title << "批准" << req.name
<< "的" << req.days << "天长假" << std::endl;
}
};
int main() {
// 使用智能指针创建责任链
auto bob = std::make_unique();
auto lucy = std::make_unique();
auto emma = std::make_unique();
auto john = std::make_unique();
// 构建责任链(逆序设置)
lucy->setSuccessor(std::move(bob)); // 总经理持有董事长
emma->setSuccessor(std::move(lucy)); // 部门经理持有总经理
john->setSuccessor(std::move(emma)); // 主管持有部门经理
// 测试用例
LeaveRequest requests[] = {
{1, "张三"},
{3, "李四"},
{7, "王五"},
{20, "赵六"},
{30, "陈七"}
};
for (const auto& req : requests) {
std::cout << "\n====== 处理" << req.name
<< "的" << req.days << "天假期申请 ======" << std::endl;
john->processRequest(req);
}
return 0;
}
运行结果如下:
import java.util.Objects;
/**
* 请假请求实体类(Immutable Object)
*/
final class LeaveRequest {
private final int days;
private final String name;
/**
* 构造请假请求
* @param days 请假天数(必须大于0)
* @param name 申请人姓名(非空)
*/
public LeaveRequest(int days, String name) {
if (days <= 0) throw new IllegalArgumentException("请假天数必须为正数");
this.days = days;
this.name = Objects.requireNonNull(name, "申请人姓名不能为空");
}
public int getDays() {
return days;
}
public String getName() {
return name;
}
}
/**
* 抽象处理者(Handler)
*/
abstract class Handler {
protected Handler nextHandler;
protected final String title;
/**
* 构造处理者
* @param title 处理者职位名称
*/
protected Handler(String title) {
this.title = title;
}
/**
* 设置下一级处理者(构建责任链)
* @param nextHandler 下一级处理者实例
* @return 当前处理者(支持链式调用)
*/
public Handler setNext(Handler nextHandler) {
this.nextHandler = nextHandler;
return this;
}
/**
* 处理请求的模板方法
* @param request 请假请求
*/
public final void handleRequest(LeaveRequest request) {
if (canHandle(request)) {
approve(request);
} else {
delegate(request);
}
}
/**
* 判断当前处理者能否处理请求
* @param request 请假请求
* @return 是否具有处理权限
*/
protected abstract boolean canHandle(LeaveRequest request);
/**
* 审批通过的具体操作
* @param request 请假请求
*/
protected void approve(LeaveRequest request) {
System.out.printf("✅ [%s] 批准 %s 的 %d 天假期%n",
title, request.getName(), request.getDays());
}
/**
* 转交请求给下一级处理者
* @param request 请假请求
*/
protected void delegate(LeaveRequest request) {
System.out.printf("➡️ [%s] 将 %s 的申请递交给上级%n",
title, request.getName());
if (nextHandler != null) {
nextHandler.handleRequest(request);
} else {
System.out.printf("⚠️ %s 的 %d 天假期申请需要更高权限审批%n",
request.getName(), request.getDays());
}
}
}
/**
* 直属主管(Concrete Handler)
* 处理规则:可批准1-2天的假期
*/
class Supervisor extends Handler {
public Supervisor() {
super("直属主管");
}
@Override
protected boolean canHandle(LeaveRequest request) {
return request.getDays() <= 2;
}
}
/**
* 部门经理(Concrete Handler)
* 处理规则:可批准3-5天的假期
*/
class DepartmentManager extends Handler {
public DepartmentManager() {
super("部门经理");
}
@Override
protected boolean canHandle(LeaveRequest request) {
return request.getDays() <= 5;
}
}
/**
* 总经理(Concrete Handler)
* 处理规则:可批准6-15天的假期
*/
class GeneralManager extends Handler {
public GeneralManager() {
super("总经理");
}
@Override
protected boolean canHandle(LeaveRequest request) {
return request.getDays() <= 15;
}
@Override
protected void approve(LeaveRequest request) {
System.out.printf("✅ 【★%s★】批准 %s 的 %d 天长假%n",
title, request.getName(), request.getDays());
}
}
/**
* 董事长(Concrete Handler)
* 处理规则:可批准任意天数的假期
*/
class Chairman extends Handler {
public Chairman() {
super("董事长");
}
@Override
protected boolean canHandle(LeaveRequest request) {
return true; // 最终处理节点
}
@Override
protected void approve(LeaveRequest request) {
System.out.printf("✅ 【最高决议】%s 批准 %s 的 %d 天超长假期%n",
title, request.getName(), request.getDays());
}
}
/**
* 客户端使用示例
*/
public class ChainOfResponsibilityDemo {
public static void main(String[] args) {
// 构建责任链
Handler chain = new Supervisor()
.setNext(new DepartmentManager())
.setNext(new GeneralManager())
.setNext(new Chairman());
// 创建测试请求
LeaveRequest[] requests = {
new LeaveRequest(1, "张三"),
new LeaveRequest(3, "李四"),
new LeaveRequest(7, "王五"),
new LeaveRequest(20, "赵六"),
new LeaveRequest(30, "陈七")
};
// 处理所有请求
for (LeaveRequest request : requests) {
System.out.printf("%n====== 处理 %s 的 %d 天假期申请 ======%n",
request.getName(), request.getDays());
chain.handleRequest(request);
}
}
}
processRequest
处理请求1. 解耦请求发送者和接收者
2. 增强灵活性和可扩展性
3. 简化对象之间的交互
4. 符合开闭原则
1. 请求可能得不到处理
2. 调试难度增加
3. 性能问题
4. 代码复杂度提升