0

0

如何在Java中编写基于责任链模式的审批流系统_处理者串联与请求在链上的传递解析

P粉602998670

P粉602998670

发布时间:2026-03-17 12:02:03

|

846人浏览过

|

来源于php中文网

原创

Handler接口必须统一返回boolean,因责任链依赖返回值决定是否继续传递;Request需为可变POJO以支持动态字段扩展;应通过List/Deque运行时组装链并注入traceId实现全链路日志追踪。

如何在java中编写基于责任链模式的审批流系统_处理者串联与请求在链上的传递解析

Handler 接口设计必须统一返回 boolean 而非 void

很多初学者把 handle() 设成 void,结果发现请求“静默消失”——链断了却没报错。责任链的核心契约是:每个 Handler 决定是否继续传递,这只能靠返回值显式表达。

典型错误现象:handleRequest() 里调用 next.handle(request) 前没判断返回值,或自己处理完直接 return,忘了调用 next;更隐蔽的是,某个 Handler 返回 false 后,后续 Handler 全被跳过,但没人意识到这是设计意图还是 bug。

  • Handler 接口必须定义 boolean handle(Request request)
  • 每个实现类在处理完逻辑后,明确 return true(终止)或 false(继续)
  • 调用链中必须检查前序返回值:if (!current.handle(req)) { next.handle(req); }
  • 避免在 handle() 内吞掉异常,否则链会在某处静默中断

链的构建不能依赖 new 多个 Handler 实例硬编码

写死 new ApproverA().setNext(new ApproverB().setNext(new ApproverC())) 看似简单,实际导致配置僵化、测试困难、无法动态增删节点。尤其审批流常需按组织架构或业务类型切换路径,硬编码会让每次变更都得改代码、发版。

常见错误是把链初始化塞进 Service 初始化块里,结果 Spring 容器启动时报 NullPointerException —— 因为 setNext() 时某些 Handler 还没被注入。

立即学习Java免费学习笔记(深入)”;

  • List<Handler>Deque<Handler> 存储处理器,运行时组装
  • Spring 场景下,通过 @Autowired List<Handler> handlers 自动收集所有实现类,再按 @Order 或自定义注解排序
  • 避免在构造函数里调用 setNext(),改用 @PostConstruct 或配置类统一 build 链
  • 链对象本身建议封装为 ApprovalChain 类,暴露 execute(Request) 方法,隐藏内部遍历逻辑

Request 对象必须可变且支持字段扩展,不能用 final 字段封装

审批过程中,不同 Handler 往往要补充信息:比如财务岗加 budgetApproved,法务岗加 contractReviewed。如果 Request 是不可变对象(如全 final 字段 + builder 构造),每加一个字段就得改类、重编译,链上各 Handler 还得强转类型才能读写,彻底破坏开闭原则。

Ava Maker
Ava Maker

Ava Maker是一款免费的在线头像生成工具,支持用户自定义设计高清免费头像

下载

典型错误现象:ApproverB 想读 ApproverA 设置的字段,结果发现 Request 没提供 setter,只好新增子类 FinanceRequest extends Request,导致链上类型判断泛滥,instanceof 满天飞。

  • Request 应设计为普通 POJO,字段 public 或带标准 getter/setter
  • 关键字段命名需带业务上下文,如 approvedByFinance 而非模糊的 flag1
  • 避免用 Map<String, Object> 存所有字段——类型丢失,IDE 无法提示,单元测试难写
  • 如需隔离字段可见性,可用包级私有字段 + 同包内专用 Handler 访问,而非靠继承

调试时看不到请求在哪一环卡住?加统一 traceId 和日志钩子

生产环境出问题,最头疼的是“这个审批单到底走到哪了?”——日志里只有零散的 “ApproverA start”、“ApproverC finish”,中间 B 没打印,是因为没执行?执行失败?还是被跳过了?没有贯穿链的日志标识,排查效率极低。

容易被忽略的是:每个 Handler 的日志打在不同线程(比如用了异步审批),或被不同 SLF4J 绑定覆盖,导致 traceId 断裂。

  • Request 中加 String traceId 字段,入口处生成并透传
  • 每个 Handler.handle() 开头打日志:log.debug("[{}] Entering {} with status {}", req.getTraceId(), this.getClass().getSimpleName(), req.getStatus())
  • Spring 环境下,用 MDC.put("traceId", req.getTraceId()) 确保异步线程也能继承
  • 链执行器(ApprovalChain.execute())捕获所有未处理异常,并在 finally 块记录 “chain terminated at [class] due to [ex]”

责任链不是写完就完事的模式,它的复杂点永远在边界:谁该终止、谁该放行、状态怎么共享、出错了怎么定位。这些地方不提前想清楚,后期加监控、改流程、查问题,全是坑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

161

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

89

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1091

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

367

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.11.30

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

135

2025.11.27

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号