枚举抽象方法定义审批结果行为更安全易维护,每个结果必须实现routetonextnode(),漏实现则编译失败;方法可接收context参数支持动态分支,返回不可变类型供工作流引擎驱动路由。

直接用枚举的抽象方法定义每种审批结果的行为,比写一堆 if-else 或配置化路由规则更安全、更易维护。关键不是“模拟”多态,而是让编译器帮你守住行为完整性——每个审批结果必须明确自己该走哪条路,漏一个就编译失败。
用抽象方法封装路由逻辑
把“审批通过”“驳回”“转审”“加签”等结果定义为枚举常量,并在枚举类中声明一个 abstract 方法,比如 routeToNextNode():
- 每个常量后紧跟 {} 块,在其中 @Override 实现该方法,返回下一个节点 ID、流程变量名或路由动作对象
- 方法体里可复用私有字段(如预设超时时间、默认抄送人列表),但不存业务上下文(如当前申请人ID——那是调用方传进来的参数)
- 返回值建议用不可变类型,例如 Optional
表示下一节点,或自定义的 RoutingDecision 枚举(含 FORWARD / TERMINATE / ESCALATE 等)
与工作流引擎联动的关键点
枚举本身不执行跳转,它只提供决策依据。实际路由由工作流引擎根据枚举返回值驱动:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在 Activiti7 中,可在 JavaDelegate 或 ExecutionListener 里调用 approvalResult.routeToNextNode(),再用 runtimeService.setVariable(executionId, "nextNode", result) 把结果透出给 BPMN 的 executionListener 或后续网关
- 若使用条件网关(Exclusive Gateway),可将枚举方法返回的字符串作为表达式变量,例如 ${nextNode == 'managerReview'}
- 避免在枚举里硬编码节点 ID 字符串;推荐用静态常量或配置中心统一管理,枚举只负责选择,不负责存储
应对动态分支场景
当“转审”需指定新审批人、“加签”需追加角色时,抽象方法可接收运行时参数:
- 定义方法为 routeToNextNode(Map
context) ,context 包含申请人、业务单据类型、组织架构快照等 - “转审”实现里可调用组织服务查该单据所属部门的副职领导,“加签”实现里可按业务规则过滤出风控组成员
- 返回值可扩展为包含目标节点 + 动态审批人集合 + 超时策略的结构体,供多实例任务直接消费
和策略模式配合提升可测性
枚举抽象方法本质是轻量级策略,适合固定结果集;若未来审批类型可能扩展(如新增“有条件通过”),可结合工厂方法封装:
- 对外暴露 ApprovalResult.from(String code) 工厂方法,内部用静态 map 缓存枚举实例,避免字符串误配
- 单元测试只需覆盖每个枚举常量的 routeToNextNode() 行为,无需启动整个工作流引擎
- 集成测试时,用真实 context 参数调用,验证返回的节点与审批人是否符合业务预期










