java多态重构审批流引擎的核心是将“谁来审、怎么审、审完去哪”从硬编码中解耦,通过approver接口统一抽象审批角色行为,各实现类(如hrapprover、financeapprover)自主封装canhandle、execute和nextnode逻辑,流程引擎仅依赖接口驱动流转;审批节点类型与具体实现解耦,由工厂按配置和运行时变量动态创建实例;状态变更与事件通知交由子类自主触发,实现高内聚、低耦合。

用Java多态重构老旧审批流引擎,核心不是替换代码,而是把“谁来审、怎么审、审完去哪”从硬编码里解放出来。重点在于让不同审批角色(如部门经理、HR、总监)各自决定自己的行为逻辑,而不是靠一堆 if-else 或 switch 判断身份再调用不同方法。
把审批人抽象成统一接口
定义一个 Approver 接口,只暴露关键行为:
- canHandle(ApprovalRequest request):判断当前角色是否该处理这个请求(比如按请假天数、金额、申请人部门等动态规则)
- execute(ApprovalRequest request):执行本环节审批动作(查权限、写日志、更新状态、发通知)
- nextNode(ApprovalRequest request):返回下一个该走的节点(可能是另一个 Approver 实例,也可能是结束或分支网关)
不再需要在流程主干里写 if (user.getRole().equals("HR")) { ... },每个实现类(DepartmentManagerApprover、HrApprover、FinanceApprover)自己封装判断和行为。
用组合代替条件分支驱动流程流转
旧系统常把整个审批链写死在 Service 方法里,新增一级就得改主逻辑。多态重构后,流程推进由对象自身决定:
- 创建一个 ProcessEngine 类,只负责调用当前 approver 的
execute()和nextNode() - 每个 approver 执行完,返回下一个 approver 实例(可为 null 表示结束,也可返回
ParallelGateway或ExclusiveGateway等网关对象) - 引擎不关心“下一个是经理还是总监”,只认
Approver接口——这正是多态的价值
例如:某报销单金额超5万时,FinanceApprover 的 nextNode() 返回 CTOApprover;否则返回 null。规则完全内聚在 FinanceApprover 内部,不影响其他环节。
审批节点与流程变量解耦
旧系统常把审批人硬编码进流程定义(如 XML 中写死 <approver>hr@company.com</approver>),导致配置即代码。多态重构后:
- 流程定义中只存节点类型标识(如
"hr-approval"、"budget-gateway") - 启动流程时,由工厂类(
ApproverFactory)根据标识和运行时变量(如request.getAmount()、request.getDept())动态选择并构造对应 approver 实例 - 同一节点类型,在不同场景下可注入不同实现(测试环境用 MockApprover,生产用 DbBackedApprover)
这样,加一个新审批角色只需新增一个 Approver 实现类 + 配置映射,无需动引擎、不动数据库表结构、不改主流程。
状态变更与事件通知交由子类自主触发
审批结果(通过/驳回/转交)不该由引擎统一设置 status 字段,而应由各 approver 自行决策并触发后续动作:
-
DepartmentManagerApprover审批通过后,调用eventPublisher.publish(new ApprovalPassedEvent(...)) -
FinanceApprover驳回时,自动触发RefundInitiatedEvent并更新申请状态为REJECTED_BY_FINANCE - 所有事件监听器(如发邮件、写审计日志、调用外部系统)保持松耦合,不侵入审批逻辑
这样,当业务要求“HR驳回需同步冻结员工账号”,只需新增一个监听 HRRejectedEvent 的处理器,原审批类一行代码不用改。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











