当前位置: 首页 > 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 处理。

相关文章:

  • 认知无线电系统中采用能量检测频谱感知
  • pytorch简单线性回归模型
  • 黑马点评--缓存更新策略及案例实现
  • ubuntu脚本常用命令
  • Halcon 图像预处理②
  • AI时代新词-数字孪生(Digital Twin)
  • 并发的产生及对应的解决方案之服务架构说明
  • 大模型Agent
  • [开源项目] 一款功能强大的超高音质音乐播放器
  • 无网络docker镜像迁移
  • 曲线匹配,让数据点在匹配数据的一侧?
  • ADS学习笔记(五) 谐波平衡仿真
  • 电子电路原理第十七章(线性运算放大器电路的应用)
  • 开疆智能Profinet转Profibus网关连接韦普泰克工业称重仪表配置案例
  • 【Qt开发】输入类控件
  • Python 字符串相似度计算:方法、应用与实践
  • WeakAuras Lua Script [ICC BOSS 11 - Sindragosa]
  • ROS2学习(10)------ROS2参数
  • STM32F103_Bootloader程序开发03 - 启动入口与升级模式判断(boot_entry.c与boot_entry.h)
  • SOC-ESP32S3部分:13-定时器
  • 北京建立网站/坚决把快准严细实要求落实到位
  • frontpage可以做网站吗/职业培训机构排名前十
  • 全景网站建设/哈尔滨关键词优化报价
  • 网站空间商是什么意思/广告接单有什么平台
  • 武汉经营性网站备案流程/企业推广app
  • 优秀政府门户网站/谷歌应用商店