java抽象类是实现模板方法模式最自然的方式,通过final模板方法定义算法骨架,abstract步骤强制子类实现,钩子方法支持可选扩展,确保流程统一且灵活。

Java 抽象类是实现模板方法模式最自然、最常用的方式。核心思路是:在抽象类中定义算法骨架(即模板方法),把可变步骤声明为抽象方法或钩子方法,由子类具体实现,从而统一流程、分离变化。
抽象类定义模板方法和抽象步骤
模板方法本身是 final 的,防止子类重写流程;而关键步骤用 abstract 声明,强制子类提供实现。
例如一个通用的「数据处理流程」:
abstract class DataProcessor {
// 模板方法:定义标准流程(不可重写)
public final void process() {
loadData();
validateData();
transformData();
saveData();
logCompletion();
}
// 由子类实现的具体步骤
protected abstract void loadData();
protected abstract void validateData();
protected abstract void transformData();
protected abstract void saveData();
// 可选的默认实现(钩子方法)
protected void logCompletion() {
System.out.println("Processing completed.");
}
}
子类只需关注差异逻辑
每个子类只负责自己领域内的具体操作,不改变整体顺序,也不重复编写流程控制代码。
比如处理 CSV 和 JSON 数据:
class CsvDataProcessor extends DataProcessor {
protected void loadData() { System.out.println("Loading CSV..."); }
protected void validateData() { System.out.println("Validating CSV format..."); }
protected void transformData() { System.out.println("Parsing CSV rows..."); }
protected void saveData() { System.out.println("Writing to CSV database..."); }
}
class JsonDataProcessor extends DataProcessor {
protected void loadData() { System.out.println("Fetching JSON from API..."); }
protected void validateData() { System.out.println("Checking JSON schema..."); }
protected void transformData() { System.out.println("Mapping to Java objects..."); }
protected void saveData() { System.out.println("Storing in NoSQL..."); }
}
灵活扩展:用钩子方法支持条件行为
除了抽象方法,还可以定义带空实现的 protected 方法作为“钩子”,子类按需覆盖,不影响主流程。
- 例如在
process()中调用beforeProcess()或onError() - 子类只重写真正需要干预的钩子,其他保持默认空逻辑
- 比抽象方法更松耦合,适合可选、非必需的扩展点
关键设计要点
- 模板方法必须是 public final,确保流程不可篡改
- 抽象步骤通常用 protected abstract,既对外隐藏,又允许子类继承实现
- 避免在抽象类构造器中调用抽象方法(可能引发 NPE)
- 钩子方法命名建议带
hook、on、before/after等前缀,提高可读性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











