news 2026/3/23 4:59:46

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

作者头像

张小明

前端开发工程师

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/3/20 13:09:21

HTML5 与 H5:别再让你的专业度在称呼中流失

在中国互联网行业的日常交流中,很少有一个词像“H5”这样被高频使用,却又被如此普遍地误解。当你听到有人说“做一个 H5”时,对方指的往往是一个在微信朋友圈传播的精美幻灯片,或者是一个简单的营销小游戏。然而,当你打…

作者头像 李华
网站建设 2026/3/20 20:25:23

3-VueAjax

什么是Vue Vue是一款用于构建用户界面的渐进式的JavaScript框架。官方网站:https://cn.vuejs.org/ 前端负责将数据以美观的样式呈现出来,而数据最终又要在数据库服务器中存储并管理。前端想要拿到数据,就需要请求服务器。然后服务器将数据返…

作者头像 李华
网站建设 2026/3/11 6:15:26

基于springBoot的房屋租赁管理系统

房屋租赁管理系统的背景意义 市场需求驱动 随着城市化进程加快,流动人口增多,房屋租赁需求持续增长。传统租赁方式依赖中介或线下沟通,效率低且信息不透明。数字化管理系统能优化流程,提升供需匹配效率,降低交易成本…

作者头像 李华
网站建设 2026/3/18 17:18:06

Java基于SSM+JSP的智慧农业无人机租赁系统的设计与实现

项目说明 农业无人机是一种在现代农业中广泛应用的无人机设备,它可以通过遥控或自主飞行,进行一系列农业作业。这些无人机通常配备有高分辨率相机和绘图设备,可以用于进行土地勘测、作物评估、农药喷洒等农业活动。无人机在农业领域的应用&am…

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

学长亲荐2026专科生AI论文工具TOP9:开题报告神器大测评

学长亲荐2026专科生AI论文工具TOP9:开题报告神器大测评 2026年专科生AI论文工具测评:如何选对“开题报告神器”? 随着AI技术在学术领域的广泛应用,越来越多的专科生开始借助智能写作工具提升论文撰写效率。然而,面对市…

作者头像 李华
网站建设 2026/3/15 20:05:13

今天面了一个来字节要求月薪23K,明显感觉他背了很多面试题...

最近有朋友去字节面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

作者头像 李华