当前位置: 首页 > news >正文

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

文章目录

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

模板方法设计模式

http://www.cnnetsun.cn/news/600127.html

相关文章:

  • GPT-OSS-120B 4bit版:本地推理提速新方案
  • IndexTTS2革命性突破:3步实现工业级情感可控语音合成
  • Windows平台APK安装终极指南:从零基础到精通部署
  • Cursor Pro功能限制解决方案:技术实现与验证方法
  • MediaPipe Holistic部署教程:Docker容器化方案详解
  • 3步解锁Cursor Pro:永久告别免费限制的终极方案
  • Cursor Free VIP:2025终极免费解锁AI编程助手完全指南
  • Cursor AI Pro免费激活终极指南:告别试用限制的完整解决方案
  • 突破3大限制:Cursor Pro无限使用的完整解决方案
  • 腾讯混元1.8B开源:轻量AI的256K上下文推理神器
  • Qwen3Guard-Stream-4B:实时拦截AI风险的4B级利器
  • Qwen-Edit-2509:AI镜头视角操控新工具,10大功能随心变!
  • Windows平台APK安装神器:零基础快速上手Android应用部署
  • Cursor Pro权限解锁实战指南:从受限到全功能使用
  • Cursor Free VIP终极指南:3步永久解锁AI编程工具
  • FanControl中文版终极教程:轻松掌握风扇控制艺术
  • Qwen3-Omni:如何实现全能多模态AI交互?
  • Lumina-DiMOO:全能扩散大模型,2倍速玩转多模态
  • AnimeGANv2功能测评:CPU也能1秒生成动漫头像
  • WanVideo fp8模型:ComfyUI视频创作效率新飞跃
  • Holistic Tracking VR场景融合:元宇宙交互系统部署
  • Qwen3Guard-Gen-0.6B:轻量AI安全分级防护工具
  • Holistic Tracking高性能推理:Google优化策略复现实战
  • Holistic Tracking入门教程:5分钟实现全身动作捕捉演示
  • APK Installer:Windows系统上的安卓应用安装终极指南
  • Qwen-Image-Lightning:8步搞定AI极速绘图
  • 5步精通Windows风扇智能调校:从噪音困扰到静音高手
  • 显卡散热终极解决方案:3大智能控温技巧告别风扇噪音
  • Cursor Free VIP终极教程:轻松解锁AI编程高级特权
  • ERNIE-4.5思维版:21B轻量模型推理能力再进化