模板方法模式通过抽象类定义算法骨架,将可变步骤延迟到子类实现。父类中的模板方法固定流程结构,子类不可修改该结构但可重写抽象方法以定制行为,如数据导出中格式化步骤可分别实现为CSV或JSON。通过钩子方法还可选择性扩展逻辑,如开启日志,从而在保证流程统一的前提下实现灵活扩展,适用于框架设计等需标准化流程的场景。

模板方法模式的核心在于定义一个算法的骨架,而将一些步骤延迟到子类中实现。它允许子类在不改变算法结构的前提下,重新定义算法中的某些步骤。这种设计模式在Java中通常通过抽象类来实现,是行为型设计模式的一种典型应用。
模板方法模式使用继承机制,把通用的行为放在父类中,把可变的部分交给子类去实现。父类中定义了一个称为“模板方法”的方法,该方法由多个步骤组成,其中一些步骤是抽象的,需要子类提供具体实现。
关键点:
在模板方法模式中,抽象类承担了顶层设计的角色:
立即学习“Java免费学习笔记(深入)”;
例如,开发一个数据导出功能,导出流程固定为:连接资源 → 查询数据 → 格式化数据 → 写入文件 → 关闭资源。其中“格式化数据”根据不同需求可能生成CSV、JSON等格式,这部分就可以定义为抽象方法。
abstract class DataExporter {
// 模板方法,定义整体流程
public final void export() {
connect();
fetchData();
formatData(); // 调用抽象方法
writeFile();
close();
}
private void connect() {
System.out.println("连接数据源...");
}
private void fetchData() {
System.out.println("获取数据...");
}
protected abstract void formatData(); // 子类必须实现
private void writeFile() {
System.out.println("写入文件...");
}
private void close() {
System.out.println("关闭资源...");
}
}
class CsvExporter extends DataExporter {
@Override
protected void formatData() {
System.out.println("格式化为CSV...");
}
}
class JsonExporter extends DataExporter {
@Override
protected void formatData() {
System.out.println("格式化为JSON...");
}
}
调用时只需:
DataExporter exporter = new CsvExporter(); exporter.export(); // 输出: // 连接数据源... // 获取数据... // 格式化为CSV... // 写入文件... // 关闭资源...
可以看到,整个流程被父类控制,子类只负责定制关键环节。
除了抽象方法,还可以定义钩子方法(hook method),让子类有能力介入流程,但不是必须的。
比如增加一个是否启用日志的钩子:
abstract class DataExporter {
// 默认不记录日志
protected boolean isLogEnabled() {
return false;
}
public final void export() {
connect();
if (isLogEnabled()) {
System.out.println("开始执行导出任务");
}
fetchData();
formatData();
writeFile();
close();
}
// ...其余方法
}
子类可以选择重写 isLogEnabled() 返回 true 来开启日志,这就是一种灵活的扩展方式。
基本上就这些。模板方法模式通过抽象类+继承的方式,实现了代码复用和流程控制,特别适合框架设计和标准化流程场景。理解它的关键是分清“变”与“不变”的部分,把不变的固化在父类,把变化的留给子类。不复杂但容易忽略细节。
以上就是在Java中如何理解模板方法模式与抽象类_模板方法核心概念分享的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号