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

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

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

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

六、模式本质理解

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

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

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

相关推荐
学习机器不会机器学习4 小时前
深入浅出JavaScript常见设计模式:从原理到实战(2)
开发语言·javascript·设计模式
碎梦归途5 小时前
23种设计模式-行为型模式之命令模式(Java版本)
java·开发语言·jvm·设计模式·命令模式·行为型模式
〆、风神8 小时前
从零搭建高可用分布式限流组件:设计模式与Redis令牌桶实践
redis·分布式·设计模式
摘星编程8 小时前
并发设计模式实战系列(8):Active Object
设计模式·并发编程
碎梦归途20 小时前
23种设计模式-行为型模式之策略模式(Java版本)
java·开发语言·jvm·设计模式·策略模式·行为型模式
Java致死1 天前
单例设计模式
java·单例模式·设计模式
麓殇⊙1 天前
设计模式--桥接模式详解
设计模式·桥接模式
学习机器不会机器学习1 天前
深入浅出JavaScript常见设计模式:从原理到实战(1)
开发语言·javascript·设计模式
ApeAssistant1 天前
Spring + 设计模式 (二十) 行为型 - 中介者模式
spring·设计模式