模板方法模式在抽象类中体现为“骨架定死、细节放开”:父类用public final方法锁定流程顺序,抽象方法定义可变环节,钩子方法支持条件分支,构造器保障初始化合规。

在抽象类里结合模板方法模式,核心是“骨架定死、细节放开”——父类把流程顺序和公共逻辑写死,只留几个关键环节让子类填空。这样既防流程被跳过或乱序,又保留业务差异化空间。
用 final 模板方法锁住执行顺序
模板方法必须声明为 public final,内部按固定顺序调用各步骤。子类无法重写它,也就没法绕过校验、颠倒步骤或漏掉归档。
- 比如定义
public final void execute() { validate(); doBusiness(); notify(); log(); } -
validate()和log()是父类已实现的具体方法,所有子类复用 -
doBusiness()设为 protected abstract,子类必须实现,且只能在这个位置被调用
把可变逻辑拆成抽象方法
不是整个流程都不同,而是少数几步因业务而异。把这些点单独抽出来,声明为抽象方法,精准控制扩展边界。
- 例如审批场景:留出
protected abstract User getApprover();和protected abstract boolean isApproved(Result result); - 子类不用管怎么查组织架构、怎么记日志,只专注回答“谁审”和“过不过”
- 参数类型、返回值、异常声明构成契约,子类必须严格匹配,编译期就卡住不合规实现
用钩子方法支持条件分支
有些步骤不是“要不要做”,而是“在什么条件下做”。钩子方法就是带默认行为的 protected 方法,子类可选择性覆盖。
- 比如
protected boolean shouldSendSms() { return false; } - 普通报销流程不发短信,但大额采购流程可重写它返回
true - 模板方法里写
if (shouldSendSms()) sendSms();,流程主干不变,行为自然分流
构造器里守住初始化底线
抽象类虽不能 new,但它的构造器会在子类实例化时自动执行。这里可以做参数校验、注入必要依赖、赋值 final 字段。
- 声明
protected final String serviceUrl;,在构造器中强制传入并赋值 - 检查关键配置是否为空,不满足直接抛
IllegalArgumentException - 确保每个子类一创建就带着合规上下文,避免运行时 NPE 或逻辑错位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











