模板方法模式通过抽象类定义流程骨架,子类仅实现抽象步骤而不改变调用顺序;抽象类含final模板方法、abstract步骤、protected通用方法和可选钩子方法;须避免模板方法非final、误设为abstract、调用非final实例方法及用接口替代抽象类。

Java 中用继承设计模板方法模式,关键在于抽象类定义流程骨架,子类只负责填充具体步骤,不碰调用顺序。
抽象类定骨架:模板方法 + 抽象步骤
在抽象父类中声明一个 final 的模板方法,它按固定顺序调用若干方法。其中:
- 用 protected abstract 声明必须由子类实现的步骤(如
validate()、process()) - 用普通 protected 方法提供通用逻辑(如
logStart()、updateStatus()),子类可直接复用 - 用带空实现的 protected 钩子方法(如
shouldRetry())供子类选择覆盖,不强制
子类只做“填空”:不重写流程,只实现抽象方法
子类继承抽象类后,编译器会强制你实现所有 abstract 方法。其他部分自动继承:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 模板方法不可重写(因是
final),保证流程不被破坏 - 父类已实现的具体方法可直接使用,避免重复编码
- 若某步骤在多数子类中逻辑一致,就放在抽象类里实现;仅个别子类不同,才声明为
abstract
典型结构示例:订单处理
比如抽象类 OrderProcessor 定义流程:checkStock() → calculatePrice() → charge() → ship():
-
checkStock()和ship()是通用操作,父类直接实现 -
calculatePrice()和charge()声明为abstract,交由VipOrderProcessor或InternationalOrderProcessor各自实现 -
isExpressShipping()是钩子方法,默认返回false,国际订单子类可覆盖为true
必须避开的坑
几个容易出错但影响严重的设计点:
- 模板方法没加
final—— 子类可能重写整个流程,导致骨架失效 - 把模板方法写成
abstract—— 子类反而要重复写调用顺序,完全违背模式初衷 - 在模板方法里调用子类可能重写的非
final实例方法 —— 构造过程中可能触发未初始化状态 - 用接口代替抽象类 —— 接口无法持有共享字段、无法控制构造顺序、也无法强制子类实现全部步骤
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










