Java设计模式之模板方法模式(Template Method Pattern)

发布于:2025-03-20 ⋅ 阅读:(22) ⋅ 点赞:(0)

模板方法模式(Template Method Pattern) 是一种 行为型设计模式,用于定义算法的骨架,将某些步骤的具体实现延迟到子类中。其核心思想是 在父类中定义算法的结构,子类在不改变算法流程的前提下重写特定步骤

1. 核心角色

角色 说明
抽象类(AbstractClass) 定义算法的骨架(模板方法),并声明抽象方法或钩子方法供子类实现。
具体子类(ConcreteClass) 实现抽象类中定义的抽象方法,完成算法中特定步骤的具体逻辑。

2. 应用场景

  • 固定流程,可变细节:当多个类有相似的流程,但某些步骤实现不同时(如数据处理流程、文件解析流程)。

  • 框架扩展:框架定义通用流程,允许用户自定义部分步骤(如Servlet生命周期、JUnit测试流程)。

  • 避免代码重复:抽取公共代码到父类,减少冗余。


3. 代码示例:制作饮料

假设需要实现制作茶和咖啡的流程,两者步骤类似(烧水、冲泡、倒入杯子),但具体冲泡方法和添加调料不同。

步骤1:定义抽象类(模板方法)
步骤2:实现具体子类
步骤3:客户端调用

4. 模板方法模式类图

5. 模板方法模式优缺点

优点 缺点
代码复用性强,减少冗余代码。 每个不同实现需一个子类,可能增加类的数量。
父类控制算法流程,子类扩展细节。 父类与子类耦合度高,修改父类可能影响子类。
通过钩子方法提供扩展点。

6. 模板方法模式 vs. 策略模式

模式 核心思想 适用场景
模板方法模式 父类定义算法骨架,子类实现细节。 流程固定,部分步骤可变。
策略模式 定义算法族,封装为独立策略类。 需要动态切换完整算法实现。

7. 实际应用场景

  1. Servlet生命周期

    • javax.servlet.http.HttpServlet 的 service() 方法调用 doGet() 或 doPost()

    • 用户只需重写 doGet(),无需关注请求分发的逻辑。

  2. JUnit测试框架

    • 测试类的 setUp() 和 tearDown() 方法为模板方法,由框架调用。

    • 用户重写这些方法定义测试环境初始化和清理。

  3. Spring框架

    • JdbcTemplate 的 execute() 方法定义连接获取、异常处理等流程。

    • 用户通过回调接口(如 PreparedStatementCreator)实现具体SQL操作。


9. 总结

  • 核心价值:通过父类定义算法流程,子类灵活实现具体步骤,实现代码复用和流程控制。

  • 关键设计:模板方法声明为 final 防止子类修改流程,抽象方法强制子类实现必要步骤。

  • 适用性:适用于具有固定流程但部分步骤需要定制的场景,如框架扩展、多态流程处理。