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