抽象类适合定义通用业务流程骨架,核心是模板方法模式:用final修饰主流程方法(如execute()),内部按序调用抽象方法(必须实现)、钩子方法(可选重写)和已实现的公共逻辑(如日志、事务)。

抽象类适合定义通用业务流程骨架,核心是用 模板方法模式 —— 把流程步骤声明为抽象或钩子方法,由子类实现具体逻辑,父类控制执行顺序和公共处理。
定义抽象流程骨架
在抽象类中用 final 修饰主流程方法(如 execute()),内部按顺序调用一系列可定制的方法。这些方法分为三类:
-
抽象方法:必须由子类实现,代表流程中不可省略、差异大的环节(如
validate()、doBusiness()) -
默认空实现的钩子方法:用
protected+ 空方法体声明(如beforeExecute()、afterSuccess()),子类按需重写 - 已实现的公共逻辑:日志、事务、异常统一处理、参数校验等,直接写在抽象类里
典型结构示例
比如一个订单处理骨架:
public abstract class OrderProcessTemplate {
// 主流程(不可重写)
public final void execute(Order order) {
beforeExecute();
validate(order);
prepareResources();
doBusiness(order);
commit();
afterSuccess();
}
<pre class="brush:php;toolbar:false;">protected void beforeExecute() {} // 钩子
protected abstract void validate(Order order); // 必须实现
protected void prepareResources() {} // 可选重写
protected abstract void doBusiness(Order order); // 必须实现
protected void commit() { /* 事务提交 */ } // 已实现
protected void afterSuccess() {} // 钩子}
子类只需关注自身业务,不破坏流程结构:
public class VipOrderProcess extends OrderProcessTemplate {
@Override
protected void validate(Order order) {
if (order.getAmount() <h3>增强健壮性和扩展性</h3><p>实际项目中可补充以下设计:</p>
- 用
enum或配置标识流程变体,在抽象类中通过switch或策略映射选择不同钩子行为 - 把部分抽象方法改为
Optional<supplier>></supplier>类型参数,支持运行时注入逻辑(适用于简单定制) - 在主流程中加入
try-catch,对不同阶段异常做差异化处理(如校验失败 vs 执行失败) - 提供带返回值的模板方法(如
<r> R executeWithResult(...)</r>),方便链式调用或结果聚合
避免常见误区
编写时注意三点:
- 不要在抽象方法中调用子类可能重写的钩子方法(易引发初始化问题)
- 主流程方法必须是
final,否则子类绕过骨架直接调用底层方法,破坏约束 - 钩子方法命名要体现时机(如
onRetry()、onTimeout()),避免语义模糊
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











