news 2026/4/15 10:54:41

设计模式——模板方法模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式——模板方法模式

模板方法模式 (Template Method Pattern)

什么是模板方法模式?

模板方法模式是一种行为型设计模式,它允许你在父类中定义一个算法的框架,而将一些步骤的实现延迟到子类中

简单来说:模板方法模式就是"模板",父类定义框架,子类实现细节。

生活中的例子

想象一下:

  • 做菜:准备食材 → 烹饪 → 装盘(步骤相同,具体做法不同)
  • 考试:答题 → 交卷(步骤相同,具体内容不同)
  • 旅游:订票 → 出行 → 游玩 → 返回(步骤相同,具体安排不同)

为什么需要模板方法模式?

传统方式的问题

// 每个子类都要重复定义框架classA{publicvoiddoSomething(){step1();step2();step3();}}classB{publicvoiddoSomething(){step1();step2();step3();}}

问题

  1. 代码重复:框架代码重复
  2. 难以维护:修改框架需要修改多个类
  3. 不一致:框架可能不一致

模板方法模式的优势

// 父类定义框架,子类实现细节abstractclassTemplate{publicvoiddoSomething(){step1();step2();step3();}protectedabstractvoidstep1();protectedabstractvoidstep2();protectedabstractvoidstep3();}

优势

  1. 代码复用:框架代码复用
  2. 易于维护:修改框架只需修改父类
  3. 一致性:框架保持一致
  4. 扩展容易:新增子类很容易

模板方法模式的结构

┌─────────────────────┐ │ AbstractClass │ 抽象类 ├─────────────────────┤ │ + templateMethod() │ │ : void │ │ # primitiveOp1(): │ │ void │ │ # primitiveOp2(): │ │ void │ │ # primitiveOp3(): │ │ void │ └──────────┬──────────┘ │ 继承 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────┐ ┌───────────┴───────┐ ┌───┴────────┐ │ ConcreteClass1 │ │ ConcreteClass2 │ │ ... │ 具体类 ├─────────────────┤ ├───────────────────┤ ├────────────┤ │ + primitiveOp1() │ │ + primitiveOp1() │ │ │ │ + primitiveOp2() │ │ + primitiveOp2() │ │ │ │ + primitiveOp3() │ │ + primitiveOp3() │ │ │ └─────────────────┘ └───────────────────┘ └────────────┘

代码示例

1. 定义抽象类

/** * 抽象类:做菜 */publicabstractclassCookDish{/** * 模板方法:定义做菜的流程 */publicfinalvoidcook(){prepareIngredients();cookDish();serveDish();}/** * 基本方法:准备食材 */protectedabstractvoidprepareIngredients();/** * 基本方法:做菜 */protectedabstractvoidcookDish();/** * 基本方法:上菜 */protectedabstractvoidserveDish();}

2. 定义具体类

/** * 具体类:做宫保鸡丁 */publicclassKungPaoChickenextendsCookDish{@OverrideprotectedvoidprepareIngredients(){System.out.println("准备食材:鸡胸肉,花生米,干辣椒,花椒,葱,姜,蒜");}@OverrideprotectedvoidcookDish(){System.out.println("做菜步骤:");System.out.println("1. 鸡肉切丁,腌制");System.out.println("2. 花生米炸香盛起");System.out.println("3. 热锅下油,炒鸡丁");System.out.println("4. 加入干辣椒、花椒爆香");System.out.println("5. 调味,加入花生米翻炒");}@OverrideprotectedvoidserveDish(){System.out.println("上菜:宫保鸡丁做好了!");}}/** * 具体类:做西红柿炒鸡蛋 */publicclassTomatoEggsextendsCookDish{@OverrideprotectedvoidprepareIngredients(){System.out.println("准备食材:西红柿2个,鸡蛋3个,葱,盐,糖");}@OverrideprotectedvoidcookDish(){System.out.println("做菜步骤:");System.out.println("1. 西红柿切块,鸡蛋打散");System.out.println("2. 热锅下油,炒鸡蛋盛起");System.out.println("3. 下西红柿炒出汁");System.out.println("4. 加入鸡蛋翻炒,调味");}@OverrideprotectedvoidserveDish(){System.out.println("上菜:西红柿炒鸡蛋做好了!");}}

3. 使用模板方法

/** * 模板方法模式测试类 * 演示如何使用模板方法模式做菜 */publicclassTemplateMethodTest{publicstaticvoidmain(String[]args){System.out.println("=== 模板方法模式测试 ===\n");// 做西红柿炒鸡蛋System.out.println("--- 做西红柿炒鸡蛋 ---");CookDishtomatoEggs=newTomatoEggs();tomatoEggs.cook();System.out.println("\n--- 做宫保鸡丁 ---");CookDishkungPaoChicken=newKungPaoChicken();kungPaoChicken.cook();System.out.println("\n=== 模板方法模式的优势 ===");System.out.println("1. 代码复用:框架代码复用");System.out.println("2. 易于维护:修改框架只需修改父类");System.out.println("3. 一致性:框架保持一致");System.out.println("4. 扩展容易:新增子类很容易");System.out.println("5. 控制扩展:父类控制扩展点");System.out.println("\n=== 实际应用场景 ===");System.out.println("1. Servlet:HttpServlet的doGet、doPost");System.out.println("2. JDBC:JDBC的执行流程");System.out.println("3. Spring:JdbcTemplate、RestTemplate");System.out.println("4. 生命周期:对象的生命周期管理");System.out.println("5. 算法框架:算法框架的实现");System.out.println("\n=== 钩子方法 ===");System.out.println("钩子方法是在模板方法中提供扩展点的方法:");System.out.println("- 可以在子类中覆盖");System.out.println("- 可以在模板方法中条件调用");System.out.println("- 提供更多的灵活性");}}

模板方法模式的优点

  1. 代码复用:框架代码复用
  2. 易于维护:修改框架只需修改父类
  3. 一致性:框架保持一致
  4. 扩展容易:新增子类很容易
  5. 控制扩展:父类控制扩展点

模板方法模式的缺点

  1. 继承限制:只能通过继承扩展
  2. 类数量增加:每个实现都需要一个子类

适用场景

  1. 步骤固定:算法的步骤固定,但具体实现不同
  2. 代码复用:需要复用框架代码
  3. 控制扩展:需要控制扩展点

常见应用场景

  • Servlet:HttpServlet的doGet、doPost
  • JDBC:JDBC的执行流程
  • Spring:JdbcTemplate、RestTemplate

使用建议

  • 步骤固定:使用模板方法模式
  • 代码复用:使用模板方法模式
  • 步骤不固定:直接使用策略模式

注意事项

⚠️ 模板方法模式虽然有用,但要注意:

  • 不要让模板方法过于复杂
  • 考虑使用钩子方法
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 18:44:21

Laravel框架学习路径全解析

以下是学习Laravel框架的系统路径: 一、基础准备 环境搭建 安装PHP 8.0(推荐8.1)配置Composer:composer global require laravel/installer创建项目:laravel new project_name 目录结构解析 app/ # 核心代码…

作者头像 李华
网站建设 2026/4/5 11:52:04

金三银四,我不允许你们不知道这些软件测试面试题

01、您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答:有黑盒和白盒两种测试种类,黑盒有等价类划分法,边界分析法,因果图法和错误猜测法。白盒有逻辑覆盖法&…

作者头像 李华
网站建设 2026/4/1 14:49:06

远程控制+智能调度,打造园区电力“无人值守”新模式

1、概述 电力监控系统实现对园区变电站、配电房内断路器、变压器、柴油发电机以及其它重要设备进行监视、测量、记录、报警等功能,并与保护设备和远方控制中心及其他设备通信,实时掌握园区变电站和配电房运行状况,快速排除故障,保…

作者头像 李华
网站建设 2026/4/13 15:24:55

基于springBoot的高校毕业生公职资讯系统的设计与实现

高校毕业生公职资讯系统的背景 高校毕业生数量逐年增加,就业压力不断增大。公职岗位因其稳定性、福利保障等特点,成为许多毕业生的首选就业方向。然而,公职考试信息分散、更新不及时、缺乏针对性指导等问题,导致毕业生在获取有效…

作者头像 李华
网站建设 2026/4/12 14:16:04

vcruntime140.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/12 3:29:04

2025年度精粹|乳酰化研究大爆发:一文汇总年度重要突破

精准医学与蛋白组学关注国内外蛋白组学、蛋白修饰组学应用领域的科研进展,普及蛋白组学在生命科学及基础医学研究中的应用,一起交流学习。如有侵权请联系后台删除时光飞逝,2025年的科研画卷已徐徐合拢。过去一年,乳酰化修饰在24年…

作者头像 李华