1. 责任链模式:从概念到实战
作为一名Java开发者,我经常遇到需要处理复杂业务逻辑的场景。记得有一次在开发一个审批系统时,我尝试用传统的if-else嵌套来处理多级审批流程,结果代码变得臃肿不堪,每次新增审批层级都需要修改核心逻辑。直到我发现了责任链模式,才真正解决了这个痛点。
责任链模式(Chain of Responsibility)是一种行为型设计模式,它通过将多个处理对象连成一条链,让请求沿着这条链传递,直到有对象能够处理它为止。这种模式最大的优势在于解耦了请求的发送者和接收者,让多个对象都有机会处理请求,而不需要知道具体由谁来处理。
1.1 为什么需要责任链模式
在日常开发中,我们经常会遇到这样的场景:
- 一个请求需要经过多个处理步骤
- 每个处理步骤可能有自己的处理逻辑
- 处理步骤的顺序可能需要动态调整
- 新的处理步骤可能需要随时添加
如果用传统的硬编码方式实现,代码会变得难以维护。而责任链模式正好解决了这些问题,它让每个处理者只关注自己的职责范围,将处理者之间的关系解耦,使系统更加灵活和可扩展。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 责任链模式的核心结构
2.1 角色划分
责任链模式主要包含三个核心角色:
- 抽象处理者(Handler):定义处理请求的接口,通常包含一个处理请求的方法和一个设置后继处理者的方法。
- 具体处理者(Concrete Handler):实现抽象处理者的接口,负责处理自己能够处理的请求,如果不能处理则传递给下一个处理者。
- 客户端(Client):创建处理链,并向链头的处理者提交请求。
2.2 UML类图解析
code复制┌─────────────┐ ┌──────────────────┐
│ Client │ │ Handler │
└─────────────┘ ├──────────────────┤
│ │ + successor │
│ │ + handleRequest()│
▼ │ + setSuccessor() │
┌─────────────┐ └────────┬─────────┘
│ Request │ △
└─────────────┘ │
┌───────┴───────┐
│ │
┌─────────────────┐ ┌─────────────────┐
│ ConcreteHandler1│ │ ConcreteHandler2│
├─────────────────┤ ├─────────────────┤
│ + handleRequest()│ │ + handleRequest()│
└─────────────────┘ └─────────────────┘
这个类图清晰地展示了责任链模式的结构:客户端创建请求对象并将其发送给处理链的第一个处理者,每个处理者决定是自己处理请求还是将其传递给下一个处理者。
3. 深入代码实现:请假审批系统
让我们通过一个完整的请假审批系统示例来深入理解责任链模式的实现。这个系统包含三个审批级别:辅导员(3天以内)、院长(5天以内)和校长(不限天数)。
3.1 请求对象定义
首先,我们定义请假条类,包含请假人姓名和请假天数:
java复制public class LeaveRequest {
private String employeeName;
private int leaveDays;
public LeaveRequest(String employeeName, int leaveDays) {
this.employeeName = employeeName;
this.leaveDays = leaveDays;
}
// Getter和Setter方法
public String getEmployeeName() {
return employeeName;
}
public int getLeaveDays() {
return leaveDays;
}
}
3.2 抽象处理者实现
定义抽象的审批者类,包含设置下一个审批者和处理请假请求的方法:
java复制public abstract class Approver {
protected Approver nextApprover;
public void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
public abstract void processLeaveRequest(LeaveRequest request);
}
3.3 具体处理者实现
实现三个具体的审批者类:
辅导员审批者(3天以内):
java复制public class Counselor extends Approver {
@Override
public void processLeaveRequest(LeaveRequest request) {
if (request.getLeaveDays() <= 3) {
System.out.println("辅导员批准了" + request.getEmployeeName() +
"的" + request.getLeaveDays() + "天请假");
} else if (nextApprover != null) {
nextApprover.processLeaveRequest(request);
}
}
}
院长审批者(5天以内):
java复制public class Dean extends Approver {
@Override
public void processLeaveRequest(LeaveRequest request) {
if (request.getLeaveDays() <= 5) {
System.out.println("院长批准了" + request.getEmployeeName() +
"的" + request.getLeaveDays() + "天请假");
} else if (nextApprover != null) {
nextApprover.processLeaveRequest(request);
}
}
}
校长审批者(不限天数):
java复制public class Principal extends Approver {
@Override
public void processLeaveRequest(LeaveRequest request) {
System.out.println("校长批准了" + request.getEmployeeName() +
"的" + request.getLeaveDays() + "天请假");
}
}
3.4 客户端使用示例
最后是客户端代码,构建责任链并提交请假请求:
