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

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

模板方法模式 (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

使用建议

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

注意事项

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

  • 不要让模板方法过于复杂
  • 考虑使用钩子方法
http://www.jsqmd.com/news/285563/

相关文章:

  • 设计模式——桥接模式
  • 基于springBoot的高校大学生党建系统设计与实现
  • 深入解析反广告拦截器的技术实现原理
  • AI论文生成神器盘点:7款支持文献综述一键生成+真实文献交叉引用的AI工具,高效搞定论文写作!
  • Dify:一站式AI应用开发平台全解析与Windows部署指南
  • 物联网+云平台:智慧园区变电所的智能化运维革命
  • 2026 护师考试选对刷题软件,效率提升 200%(附最新排行榜)
  • 远程控制+智能调度,打造园区电力“无人值守”新模式
  • Java基于SSM+JSP的智慧农业无人机租赁系统的设计与实现
  • HTML5 与 H5:别再让你的专业度在称呼中流失
  • ARC121E Directed Tree
  • Laravel框架学习路径全解析
  • Java基于SSM+JSP的文具商城系统的设计与实现
  • Java基于SSM+JSP的学科竞赛管理系统
  • 降损增效新路径:智慧园区电能质量治理的“隐形收益”
  • 2026年宝藏获客系统-10款全场景获客神器,企业必备增长利器,建议收藏
  • 异步函数与异步生成器
  • 充电即服务:智慧园区打造“人-车-桩”智能互联新体验
  • Java基于SSM+JSP的网络远程作业批改系统的设计与实现
  • 物联网+AI双驱动,智慧园区消防电源监控迈入智能新时代
  • 道AI能不能帮助造出黄金? - 指南
  • Java基于SSM+JSP的经典诗文爱好者学习交流平台
  • CAS入门
  • Java基于SSM+JSP的网上购物商城
  • 2025年度精粹|乳酰化研究大爆发:一文汇总年度重要突破
  • Java基于SSM+JSP的高校师资管理系统的设计与实现
  • 固高运动卡运动模式介绍(转载学习)
  • 学长亲荐2026专科生AI论文工具TOP9:开题报告神器大测评
  • Java基于SSM+JSP的高校学科竞赛管理系统
  • 护资刷题 APP 推荐:2026 护资备考神器,易小考 AI 带你避开备考陷阱