行为型:责任链模式

目录

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 处理。

相关推荐
IT小白架构师之路6 天前
常用设计模式系列(十八)-责任链模式
设计模式·责任链模式
永卿00116 天前
设计模式-责任链模式
java·设计模式·责任链模式
hello 早上好16 天前
深入解析AOP调用链:递归与责任链模式的协同实现
java·责任链模式
先鱼鲨生17 天前
【Linux】System V - 责任链模式与消息队列
linux·责任链模式
搜狐技术产品小编202317 天前
浅析责任链模式在视频审核场景中的应用
java·开发语言·责任链模式
困鲲鲲17 天前
设计模式:责任链模式 Chain of Responsibility
设计模式·责任链模式
未既18 天前
java设计模式 -【责任链模式】
java·设计模式·责任链模式
CHEN5_0224 天前
设计模式——责任链模式
java·设计模式·责任链模式
似水明俊德1 个月前
责任链模式与中间件原理
责任链模式
找了一圈尾巴1 个月前
设计模式(行为型)-责任链模式
设计模式·责任链模式