行为型:责任链模式

目录

1、核心思想

2、实现方式

[2.1 模式结构](#2.1 模式结构)

[2.2 实现案例](#2.2 实现案例)

3、优缺点分析

4、适用场景

5、实践应用


1、核心思想

目的:处理某种连续的工作流,并确保业务能够被传递至相应的责任节点上得到处理。

举例

1> 报销审批流程:财务专员(1000元审批权限)​--> 财务经理(5000元审批权限)--> 财务总监(10000元审批权限)​,当前等级无权审批,则往上一等级提交

2> 请假审批流程:组长(1天审批权限)--> 经理(3天审批权限)--> HR(不限制天数),当前等级无权审批,则往上一等级提交

2、实现方式

2.1 模式结构

三种核心角色:

  • Handler(业务处理者):所有业务处理节点的顶层抽象,定义了抽象业务处理方法handle()并留给子类实现,其实体方法setSuccessor()(或setNextHandler,注入继任者)则用于责任链的构建
  • ConcreteHandler1、ConcreteHandler2......(业务处理者实现类):实际业务处理的实现类,可以有任意多个,每个都实现了handle()方法以处理自己职权范围内的业务,职权范围之外的事则传递给下一位继任者(另一个业务处理者)。
  • Client(客户端):业务申请人,组装处理链,并将请求发送到链的起始点。

模式变体:

  • 纯责任链:请求必须被某个处理者处理,否则抛出异常。

  • 不纯责任链:允许请求未被处理(需在链末端添加默认处理者)。

2.2 实现案例

以请假审批流程为例:

java 复制代码
// 1、业务处理者(抽象处理者)
public abstract class Handler {
    protected Handler nextHandler;//下一位审批人,更高级别领导

    public Handler setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
        return this.nextHandler;
    }

    public abstract void handleRequest(LeaveRequest request);
}

// 2、业务处理者实现类(具体处理者):组长、经理、HR
public class GroupLeader extends Handler {
    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getDays() <= 1) {
            System.out.println("组长批准请假" + request.getDays() + "天");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request); // 传递给下一级
        }
    }
}

public class Manager extends Handler {
    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getDays() <= 3) {
            System.out.println("经理批准请假" + request.getDays() + "天");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class HR extends Handler {
    @Override
    public void handleRequest(LeaveRequest request) {
        System.out.println("HR批准请假" + request.getDays() + "天");
    }
}

// 3、客户端
public class Client {
    public static void main(String[] args) {
        Handler groupLeader = new GroupLeader();
        // 组装责任链
        groupLeader.setNextHandler(manager).setNextHandler(hr);
       
        // 发送请求
        groupLeader.handleRequest(new LeaveRequest(2));
    }
}

3、优缺点分析

优点:

  • 解耦:请求发送者无需知道具体处理者,只需将请求发送到链上。

  • 动态性:可灵活调整处理者顺序或增减处理者。

  • 符合单一职责原则:每个处理者只关注自己能处理的请求。

缺点:

  • 请求未处理风险:若链未正确配置,请求可能未被任何处理者处理。

  • 性能问题:长链可能导致处理延迟。

  • 调试困难:请求传递路径复杂时,调试难度增加。

4、适用场景

  • 多级审批流程:如请假、报销审批。

  • 事件处理:如 GUI 中的事件冒泡机制。

  • 过滤器链:如 Web 框架中的请求过滤(Servlet Filter、Spring Security)。

5、实践应用

  • Java Servlet 的 FilterChain:每个过滤器决定是否将请求传递给下一个。

  • Spring MVC 的 HandlerInterceptor:拦截器链处理 HTTP 请求前后逻辑。

  • 日志框架(如 Log4j):不同日志级别由不同 Logger 处理。

相关推荐
!!!5251 天前
策略模式与责任链模式学习笔记:从入门到理解
学习·责任链模式·策略模式
xiaolin033311 天前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
冼紫菜20 天前
如何使用责任链模式优雅实现功能(滴滴司机、家政服务、请假审批等)
java·开发语言·设计模式·责任链模式
LIU_Skill1 个月前
SystemV-消息队列与责任链模式
linux·数据结构·c++·责任链模式
Pasregret1 个月前
责任链模式:从 Sentinel 流控到审批流程的链式处理
sentinel·责任链模式
骊山道童1 个月前
设计模式-责任链模式
设计模式·责任链模式
喵手2 个月前
Spring Boot 项目基于责任链模式实现复杂接口的解耦和动态编排!
spring boot·后端·责任链模式
云徒川2 个月前
【设计模式】责任链模式
设计模式·责任链模式
自在如风。2 个月前
Java 设计模式:责任链模式详解
java·设计模式·责任链模式