抽象类为审批节点提供统一契约和骨架结构,固化日志记录、上下文初始化等通用逻辑,将“谁审、审什么、往哪走”交由子类实现;通过abstract class ApprovalNode定义基类,强制实现doExecute(),提供onReject()钩子和afterExecution()扩展点,封装final execute()主干流程,统一管理TaskContext上下文与责任链调度。

抽象类在审批流系统中不直接定义“流转逻辑”,而是为所有审批节点提供统一的行为契约和可复用的骨架结构。它把不变的部分固化,把变化的部分留给子类决定——比如谁来审、审什么、审完往哪走,这些由具体节点实现;而日志记录、上下文初始化、状态校验等通用动作,则由抽象类统一管理。
定义审批节点的抽象基类
用 abstract class ApprovalNode 声明基础节点类型,它不处理任何具体业务,但强制子类明确回答三个问题:
- 这个节点要校验或执行什么?→ 通过 abstract boolean doExecute(TaskContext context) 约束
- 执行失败时怎么反馈?→ 提供 protected void onReject(TaskContext context) 钩子(默认空实现)
- 执行成功后是否继续流转?→ 由 doExecute() 返回值决定,true 表示终止,false 表示交由下一个节点
封装通用流程控制逻辑
抽象类里写死主干流程,避免每个节点重复造轮子:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 final boolean execute(TaskContext context) 方法中,自动记录开始时间、注入 traceId、调用 doExecute(context)
- 执行前调用 validatePreconditions(context)(可被子类重写),防止空申请人、缺失表单等基础错误穿透到下游
- 执行后统一触发 afterExecution(context) 钩子,用于保存快照、发通知等,子类按需增强
统一上下文与变量传递机制
不许子类各自 new Context 或用 Map 乱传数据。抽象类内定义标准容器:
立即学习“Java免费学习笔记(深入)”;
- TaskContext 是泛型安全的上下文对象,提供 context.set("approverId", userId) 和 context.get("budgetCode", String.class)
- 抽象类在 execute() 开始时自动注入 tenantId、operator、bizId 等公共字段,子类无需感知来源
- 所有节点操作同一份上下文,保证变量在整条链上自然透传、线程安全、调试可见
配合责任链实现动态流转
抽象节点本身不持有 next 节点,而是由外部流程引擎组装:
- 运行时通过 @Autowired List<ApprovalNode> 收集所有子类实例,按 @Order 或配置顺序排成链
- 流程引擎调用首个节点的 execute(context),其内部根据 doExecute() 返回值决定是否调用链上下一个
- 驳回、跳过、终止等语义全由子类在 doExecute() 中 return true/false 表达,链式调度逻辑完全解耦


















