news 2026/5/30 2:18:41

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

作者头像

张小明

前端开发工程师

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/5/24 15:38:07

AnimeGANv2实战:风景照秒变宫崎骏动画风格

AnimeGANv2实战:风景照秒变宫崎骏动画风格 1. 引言:从现实到二次元的视觉跃迁 在数字内容创作日益普及的今天,将真实世界的照片转换为具有艺术风格的图像已成为计算机视觉领域的重要应用方向。其中,AnimeGANv2 作为一款基于生成…

作者头像 李华
网站建设 2026/5/29 18:18:09

MediaPipe Holistic技术揭秘:Google的模型融合策略

MediaPipe Holistic技术揭秘:Google的模型融合策略 1. 引言:AI 全身全息感知的技术演进 在计算机视觉领域,人体理解一直是极具挑战性的任务。传统方法往往将人脸、手势和姿态作为独立模块处理,导致系统复杂、延迟高且难以协同。…

作者头像 李华
网站建设 2026/5/24 14:10:23

Windows APK安装器终极教程:告别模拟器的跨平台安装神器

Windows APK安装器终极教程:告别模拟器的跨平台安装神器 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为安卓模拟器占用大量系统资源而烦恼吗&#x…

作者头像 李华
网站建设 2026/5/24 14:47:13

从0到1体验IndexTTS2,科哥镜像+微PE轻松搞定环境问题

从0到1体验IndexTTS2,科哥镜像微PE轻松搞定环境问题 在AI语音合成技术日益成熟的今天,开发者和应用者面临的最大障碍往往不是模型能力本身,而是如何快速、稳定地部署一个完整的推理环境。尤其是在异构设备频出、系统权限受限的现实场景中&am…

作者头像 李华
网站建设 2026/5/1 8:00:59

Pony V7:AI角色生成神器,解锁多物种超高清创作

Pony V7:AI角色生成神器,解锁多物种超高清创作 【免费下载链接】pony-v7-base 项目地址: https://ai.gitcode.com/hf_mirrors/purplesmartai/pony-v7-base 导语:PurpleSmartAI推出的Pony V7模型凭借AuraFlow架构,实现了从…

作者头像 李华
网站建设 2026/5/29 6:27:28

FanControl终极指南:轻松掌控电脑风扇,告别噪音烦恼

FanControl终极指南:轻松掌控电脑风扇,告别噪音烦恼 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…

作者头像 李华