当前位置: 首页 > news >正文

行为型:责任链模式

目录

1、核心思想

2、实现方式

2.1 模式结构

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 实现案例

以请假审批流程为例:

// 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 处理。

http://www.xdnf.cn/news/655957.html

相关文章:

  • 【DCCN】多模态情感分析解耦交叉属性关联网络
  • java虚拟机
  • 第11章 标准化和软件知识产权基础知识,多媒体、图像相关
  • 认识微服务
  • 区块链与Web3:如何有效保障个人数据安全
  • 扩容的未来:Web3 并行计算赛道全景图谱
  • moviepy视频添加中文水印
  • 网络原理 | TCP与UDP协议的区别以及回显服务器的实现
  • 热门大型语言模型(LLM)应用开发框架
  • yolov8分割任务的推理和后处理解析
  • HMI仿真报错
  • 【MATLAB例程】声纳信号处理与目标测距的程序|信号频率、信噪比、采样率和声速均可自行调整|附代码下载链接
  • 【Bug】--node命令加载失败
  • 安卓端智能耗材柜系统可行性方案(基于uniapp + Vue3)
  • 数据的六个特性以及由于独特性产生的一些有趣的想法
  • 【C/C++】基于 Docker 容器运行的 Kafka + C++ 练手项目
  • Vue条件渲染
  • JavaScripts console.log和console.dir区别
  • Linux基本指令篇 —— clear指令
  • Vue 前端全方位性能优化指南
  • 【Hive基础】01.数据模型、存储格式、排序方式
  • FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制
  • 双11、618大促要做什么?
  • vs2022 调试时 控制台界面不出来
  • 基于离散元仿真软件DEMms的双锥水力旋流器-颗粒分离性能分析
  • 白平衡校正中冯・克里兹参数计算过程详解
  • 通过Jflash合并Boot和App两个hex为一个hex的办法
  • C++11——智能指针
  • Django压缩包形式下载文件
  • Halcon 图像预处理②