模板方法模式(Template Method Pattern) 是一种 行为型设计模式,用于定义算法的骨架,将某些步骤的具体实现延迟到子类中。其核心思想是 在父类中定义算法的结构,子类在不改变算法流程的前提下重写特定步骤。
1. 核心角色
角色 | 说明 |
---|---|
抽象类(AbstractClass) | 定义算法的骨架(模板方法),并声明抽象方法或钩子方法供子类实现。 |
具体子类(ConcreteClass) | 实现抽象类中定义的抽象方法,完成算法中特定步骤的具体逻辑。 |
2. 应用场景
固定流程,可变细节:当多个类有相似的流程,但某些步骤实现不同时(如数据处理流程、文件解析流程)。
框架扩展:框架定义通用流程,允许用户自定义部分步骤(如Servlet生命周期、JUnit测试流程)。
避免代码重复:抽取公共代码到父类,减少冗余。
3. 代码示例:制作饮料
假设需要实现制作茶和咖啡的流程,两者步骤类似(烧水、冲泡、倒入杯子),但具体冲泡方法和添加调料不同。
步骤1:定义抽象类(模板方法)

步骤2:实现具体子类

步骤3:客户端调用
4. 模板方法模式类图
5. 模板方法模式优缺点
优点 | 缺点 |
---|---|
代码复用性强,减少冗余代码。 | 每个不同实现需一个子类,可能增加类的数量。 |
父类控制算法流程,子类扩展细节。 | 父类与子类耦合度高,修改父类可能影响子类。 |
通过钩子方法提供扩展点。 |
6. 模板方法模式 vs. 策略模式
模式 | 核心思想 | 适用场景 |
---|---|---|
模板方法模式 | 父类定义算法骨架,子类实现细节。 | 流程固定,部分步骤可变。 |
策略模式 | 定义算法族,封装为独立策略类。 | 需要动态切换完整算法实现。 |
7. 实际应用场景
Servlet生命周期
javax.servlet.http.HttpServlet
的service()
方法调用doGet()
或doPost()
。用户只需重写
doGet()
,无需关注请求分发的逻辑。
JUnit测试框架
测试类的
setUp()
和tearDown()
方法为模板方法,由框架调用。用户重写这些方法定义测试环境初始化和清理。
Spring框架
JdbcTemplate
的execute()
方法定义连接获取、异常处理等流程。用户通过回调接口(如
PreparedStatementCreator
)实现具体SQL操作。
9. 总结
核心价值:通过父类定义算法流程,子类灵活实现具体步骤,实现代码复用和流程控制。
关键设计:模板方法声明为
final
防止子类修改流程,抽象方法强制子类实现必要步骤。适用性:适用于具有固定流程但部分步骤需要定制的场景,如框架扩展、多态流程处理。