谁该处理我的请假?------责任链模式

一、生活中的责任链:请假审批流程
想象一个公司请假流程:员工提交申请后,1天内 小组长审批,1-3天 需部门经理审批,超过3天 由CTO审批。每个审批人只关注自己权限范围内的请求,若超出权限则自动转交下一级。这种"接力式处理"的机制,就是责任链模式的典型应用
二、责任链模式的核心特点
特点:
- 解耦性强:请求发送者无需知道具体处理者,处理者之间无需知道彼此的存在。(员工只需提交申请,无需关心谁来审批)
- 动态扩展灵活:新增审批环节只需添加新处理器,无需修改原有代码。(增加HR总监审批只需新增一个Handler)
- 职责单一:每个处理者只处理自己职责范围内的任务。(小组长不处理超过1天的申请)
缺点注意点:
- 长链条可能影响性能
- 客户端需正确配置链条,否则易出错
- 请求可能未被处理(如责任链断裂)
三、代码实现:请假审批责任链
完整代码示例:
java
// 抽象审批处理器
public abstract class ApproveHandler {
protected ApproveHandler next; // 链式关键:保存下一个节点
public void setNext(ApproveHandler next) {
this.next = next;
}
public abstract void handleRequest(int days);
}
// 小组长审批(处理1天以内)
public class GroupLeaderHandler extends ApproveHandler {
@Override
public void handleRequest(int days) {
if (days <= 1) {
System.out.println("小组长审批通过:请假" + days + "天");
} else if (next != null) {
next.handleRequest(days); // 转交下一节点
}
}
}
// 部门经理审批(处理1-3天)
public class DeptManagerHandler extends ApproveHandler {
@Override
public void handleRequest(int days) {
if (days > 1 && days <= 3) {
System.out.println("部门经理审批通过:请假" + days + "天");
} else if (next != null) {
next.handleRequest(days);
}
}
}
// CTO审批(处理3天以上)
public class CTOHandler extends ApproveHandler {
@Override
public void handleRequest(int days) {
if (days > 3) {
System.out.println("CTO审批通过:请假" + days + "天");
} else if (next != null) {
next.handleRequest(days);
}
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
// 构建责任链
ApproveHandler groupLeader = new GroupLeaderHandler();
ApproveHandler deptManager = new DeptManagerHandler();
ApproveHandler cto = new CTOHandler();
groupLeader.setNext(deptManager);
deptManager.setNext(cto);
// 发起请假请求
groupLeader.handleRequest(2); // 部门经理处理
groupLeader.handleRequest(5); // CTO处理
}
}
输出结果:
java
部门经理审批通过:请假2天
CTO审批通过:请假5天
四、工作中的实际应用场景
多级审批系统
- 请假、报销、采购等流程审批
- 敏感操作需多级领导确认(如服务器重启)
数据校验链
- 用户注册时的非空校验、格式校验、重复性校验
- 金融交易前的风控规则校验
异常处理机制
- 程序异常捕获时,逐级尝试恢复策略
- 网络请求失败后的重试机制(如先重试3次,再切换备用服务器)
五、框架中的经典应用
Servlet Filter
请求依次经过编码过滤器、权限过滤器、日志过滤器等
java
public class LogFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
System.out.println("请求开始时间:" + new Date());
chain.doFilter(req, res); // 传递给下一个Filter
System.out.println("请求结束时间:" + new Date());
}
}
Spring Interceptor
拦截器链实现权限检查、参数预处理等
java
public class AuthInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (!checkToken(request)) {
return false; // 中断请求
}
return true; // 继续传递
}
}
日志级别处理
DEBUG→INFO→WARN→ERROR逐级传递,直到找到匹配级别的处理器
六、模式本质理解
责任链模式像一场流程接力赛:
- 每个选手(处理器)专注自己的赛道(业务范围)
- 接力棒(请求)自动传递给下个选手
- 裁判(客户端)只需发令,无需干预比赛过程
这种设计让复杂流程变得像搭积木一样灵活,是处理多层级、多条件业务的利器。通过合理运用,能显著提升代码的可维护性和扩展性。