news 2026/6/10 13:02:25

【设计模式】模板方法模式详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式】模板方法模式详解

文章目录

    • 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教程 - 廖雪峰的官方网站

模板方法设计模式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:16:17

胡桃工具箱:重新定义你的原神桌面游戏体验

胡桃工具箱:重新定义你的原神桌面游戏体验 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao 你是…

作者头像 李华
网站建设 2026/6/10 11:21:55

小白也能懂的IndexTTS2:科哥版V23保姆级安装教程

小白也能懂的IndexTTS2:科哥版V23保姆级安装教程 1. 引言:为什么你需要本地化情感语音合成? 在AI语音技术飞速发展的今天,用户对“自然、有感情”的语音输出需求日益增长。传统的TTS(Text-to-Speech)系统…

作者头像 李华
网站建设 2026/6/9 23:37:52

Cursor AI破解终极指南:免费解锁VIP功能完整教程

Cursor AI破解终极指南:免费解锁VIP功能完整教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial re…

作者头像 李华
网站建设 2026/6/10 12:49:59

5分钟玩转AnimeGANv2:零基础打造专属二次元头像

5分钟玩转AnimeGANv2:零基础打造专属二次元头像 1. 引言:为什么你需要一个二次元头像? 在社交平台日益视觉化的今天,一张独特且富有美感的头像往往能成为个人形象的第一张名片。而将真实照片转换为二次元动漫风格图像&#xff0…

作者头像 李华
网站建设 2026/6/8 9:37:46

Wan2.2视频生成:MoE架构打造720P高清动态影像

Wan2.2视频生成:MoE架构打造720P高清动态影像 【免费下载链接】Wan2.2-I2V-A14B-Diffusers 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-I2V-A14B-Diffusers 导语:Wan2.2视频生成模型正式发布,通过创新的MoE&#xf…

作者头像 李华
网站建设 2026/6/10 12:56:05

SWE-Dev-32B:36.6%代码解决率!开源AI编程利器

SWE-Dev-32B:36.6%代码解决率!开源AI编程利器 【免费下载链接】SWE-Dev-32B 项目地址: https://ai.gitcode.com/zai-org/SWE-Dev-32B 国内AI编程领域再添新突破,清华大学知识工程实验室(THUDM)近日发布开源大模…

作者头像 李华