☰
【设计模式】模板方法模式详解
2026/10/7 20:12:18 网站建设 项目流程

文章目录

    • 1. 引言:重复流程是如何产生的?
    • 2. 什么是模板方法模式
      • GoF 定义
      • 结构
    • 3. 模板方法模式的核心思想
    • 4. 模式结构
    • 5. 示例:数据导出流程
      • 5.1 抽象模板
      • 5.2 具体实现
      • 5.3 客户端使用
    • 6. 钩子方法(Hook)
    • 7. 模板方法的优点
    • 8. 模板方法的缺点
    • 9. JDK 中的模板方法
      • `AbstractList`
    • 10. 模板方法 vs 外观模式
    • 11. 适用场景
    • 参考

1. 引言:重复流程是如何产生的?

在很多系统中,你会看到大量这样的代码:

voidprocess(){step1();step2();step3();}

但不同子类的step2()又不一样:

  • Excel 导出
  • PDF 导出
  • CSV 导出

流程是固定的,但实现细节不同。

如果每个类都自己写一套流程,就会:

  • 代码重复
  • 容易出错
  • 难以维护

模板方法模式就是为了解决“流程固定,步骤变化”的问题。

流程不变,步骤可变,这就是模板方法。


2. 什么是模板方法模式

GoF 定义

在一个方法中定义算法的骨架,而将一些步骤延迟到子类中。

详细解释:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

结构

一句话理解:

父类规定流程,子类实现细节。


3. 模板方法模式的核心思想

模板方法模式强调的是:控制权反转(IoC)

父类决定调用顺序,子类只负责实现。


4. 模式结构

包含两个核心角色:

  1. 抽象类(AbstractClass)

负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。

  • 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
  • 基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:
    • 抽象方法(Abstract Method) :一个抽象方法由抽象类声明、由其具体子类实现。
    • 具体方法(Concrete Method) :一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
    • 钩子方法(Hook Method) :在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

一般钩子方法是用于判断的逻辑方法,这类方法名一般为isXxx,返回值类型为boolean类型。

  1. 具体子类(ConcreteClass)

实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤。


5. 示例:数据导出流程

5.1 抽象模板

publicabstractclassDataExporter{// 模板方法publicfinalvoidexport(){connect();readData();writeData();close();}protectedvoidconnect(){System.out.println("连接数据库");}protectedvoidclose(){System.out.println("关闭连接");}protectedabstractvoidreadData();protectedabstractvoidwriteData();}

注意:为防止恶意操作,一般模板方法都加上 final 关键词。


5.2 具体实现

publicclassExcelExporterextendsDataExporter{@OverrideprotectedvoidreadData(){System.out.println("读取 Excel 数据");}@OverrideprotectedvoidwriteData(){System.out.println("写入 Excel 文件");}}
publicclassPdfExporterextendsDataExporter{@OverrideprotectedvoidreadData(){System.out.println("读取 PDF 数据");}@OverrideprotectedvoidwriteData(){System.out.println("写入 PDF 文件");}}

5.3 客户端使用

DataExporterexporter=newExcelExporter();exporter.export();

输出流程始终一致。


6. 钩子方法(Hook)

protectedbooleanneedLog(){returnfalse;}

子类可选择性覆盖。

模板方法 = 固定流程 + 可插拔步骤


7. 模板方法的优点

  1. 消除重复代码
  2. 统一流程规范
  3. 符合开闭原则
  4. 控制执行顺序

8. 模板方法的缺点

  1. 依赖继承
  2. 子类受父类约束
  3. 不够灵活

9. JDK 中的模板方法

AbstractList

add()→add(int,E)

父类控制流程,子类实现底层存储。


10. 模板方法 vs 外观模式

维度模板方法模式外观模式
模式类型行为型模式结构型模式
关注点算法步骤的扩展接口简化
继承关系使用继承使用组合
灵活性子类可改变部分行为隐藏子系统复杂性
使用层次同一抽象层次不同层次之间

11. 适用场景

  • 工作流
  • 框架设计
  • 代码生成
  • 导入导出

参考

模板模式 | 菜鸟教程

《图解设计模式》

模板方法 - Java教程 - 廖雪峰的官方网站

模板方法设计模式

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询