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

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

一、生活中的责任链:请假审批流程

想象一个公司请假流程:员工提交申请后,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逐级传递,直到找到匹配级别的处理器

六、模式本质理解

责任链模式像一场流程接力赛

  • 每个选手(处理器)专注自己的赛道(业务范围)
  • 接力棒(请求)自动传递给下个选手
  • 裁判(客户端)只需发令,无需干预比赛过程

这种设计让复杂流程变得像搭积木一样灵活,是处理多层级、多条件业务的利器。通过合理运用,能显著提升代码的可维护性和扩展性。

相关推荐
-权子-5 分钟前
设计模式 - 代理模式Proxy
设计模式·代理模式
StrongerLLL42 分钟前
策略模式
设计模式
程序员沉梦听雨2 小时前
适配器模式详解
设计模式·适配器模式
01空间2 小时前
设计模式简述(二)单例模式
设计模式
渊渟岳3 小时前
为什么学习设计模式?
设计模式
程序员JerrySUN8 小时前
设计模式 Day 3:抽象工厂模式(Abstract Factory Pattern)详解
设计模式·抽象工厂模式
程序员沉梦听雨11 小时前
原型模式详解
设计模式·原型模式
云徒川13 小时前
【设计模式】组合模式
设计模式·组合模式
时雨h14 小时前
责任链模式
责任链模式