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

(十 三)趣学设计模式 之 模版方法模式!

在这里插入图片描述

目录

    • 一、 啥是模板方法模式?
    • 二、 为什么要用模板方法模式?
    • 三、 模板方法模式的实现方式
    • 四、 模板方法模式的优缺点
    • 五、 模板方法模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解享元模式请看: (十 二)趣学设计模式 之 享元模式!
✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的模版方法模式

一、 啥是模板方法模式?

想象一下,你想要制作一杯咖啡 ☕。 制作咖啡的步骤大致相同:烧水 💧、冲泡咖啡 ☕、倒入杯中 🥛、加入调料 🍬。 但是,不同的咖啡,加入的调料可能不同 (比如:拿铁加牛奶,美式加糖)。

模板方法模式,就是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中! 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 🦴。

简单来说,就是定义一个模板,规定了算法的执行流程,具体的实现细节由子类来完成! 📝

  • 你有一系列相似的算法,它们的执行流程基本相同: 就像制作不同口味的咖啡 ☕!
  • 你想让子类可以灵活地定制算法的某些步骤: 就像不同的咖啡可以加入不同的调料 🍬!
  • 你想避免代码重复: 就像你不想在每个咖啡类中都重复编写烧水、冲泡咖啡、倒入杯中的代码 💧☕🥛!

二、 为什么要用模板方法模式?

用模板方法模式,好处多多 👍:

  • 代码复用: 将公共代码提取到父类中,减少代码重复 ♻️!
  • 控制算法流程: 父类控制算法的执行流程,子类只能定制特定的步骤 📝!
  • 提高扩展性: 可以方便地添加新的算法,只需要创建新的子类即可 ➕!
  • 符合开闭原则: 可以在不修改父类代码的情况下,扩展算法的功能 ✅!

三、 模板方法模式的实现方式

模板方法模式主要包含以下几个角色:

  • AbstractClass(抽象类): 定义抽象的模板方法,以及一些具体的辅助方法。 ☕ (比如:咖啡基类)
  • ConcreteClass(具体类): 实现抽象类中的抽象方法,完成算法的特定步骤。 ☕ (比如:拿铁咖啡、美式咖啡)

代码示例:

// 抽象类:咖啡
public abstract class Coffee {// 模板方法:制作咖啡public final void makeCoffee() {boilWater(); // 烧水brewCoffee(); // 冲泡咖啡pourInCup(); // 倒入杯中addCondiments(); // 加入调料}// 具体方法:烧水private void boilWater() {System.out.println("烧水");}// 抽象方法:冲泡咖啡protected abstract void brewCoffee();// 具体方法:倒入杯中private void pourInCup() {System.out.println("倒入杯中");}// 抽象方法:加入调料protected abstract void addCondiments();
}// 具体类:拿铁咖啡
public class LatteCoffee extends Coffee {@Overrideprotected void brewCoffee() {System.out.println("冲泡拿铁咖啡");}@Overrideprotected void addCondiments() {System.out.println("加入牛奶");}
}// 具体类:美式咖啡
public class AmericanCoffee extends Coffee {@Overrideprotected void brewCoffee() {System.out.println("冲泡美式咖啡");}@Overrideprotected void addCondiments() {System.out.println("加入糖");}
}// 客户端
public class Client {public static void main(String[] args) {Coffee latte = new LatteCoffee(); // 创建拿铁咖啡latte.makeCoffee(); // 制作拿铁咖啡System.out.println("---");Coffee american = new AmericanCoffee(); // 创建美式咖啡american.makeCoffee(); // 制作美式咖啡}
}

分析:

  • Coffee 是抽象类,定义了制作咖啡的模板方法 makeCoffee(),以及一些具体的辅助方法 boilWater()pourInCup(),还有一些抽象方法 brewCoffee()addCondiments()
  • LatteCoffeeAmericanCoffee 是具体类,实现了抽象类中的抽象方法,完成了冲泡咖啡和加入调料的特定步骤。

输出结果:

烧水
冲泡拿铁咖啡
倒入杯中
加入牛奶
---
烧水
冲泡美式咖啡
倒入杯中
加入糖

四、 模板方法模式的优缺点

优点:

  • 代码复用 ♻️!
  • 控制算法流程 📝!
  • 提高扩展性 ➕!
  • 符合开闭原则 ✅!

缺点:

  • 增加了系统的复杂度 😫!
  • 抽象类定义了算法的骨架,子类必须遵循这个骨架,灵活性受到限制 ⛓️!
  • 每个不同的实现都需要定义一个子类,导致类的数量增加 📈!

五、 模板方法模式的应用场景

  • 你有一系列相似的算法,它们的执行流程基本相同: 就像制作不同口味的咖啡 ☕!
  • 你想让子类可以灵活地定制算法的某些步骤: 就像不同的咖啡可以加入不同的调料 🍬!
  • 你想避免代码重复: 就像你不想在每个咖啡类中都重复编写烧水、冲泡咖啡、倒入杯中的代码 💧☕🥛!
  • 数据库访问: 数据库访问的流程通常是:建立连接、执行查询、处理结果、关闭连接。 可以使用模板方法模式来定义这个流程,具体的查询语句和结果处理由子类来完成。
  • Servlet处理: Servlet处理请求的流程通常是:接收请求、处理请求、发送响应。 可以使用模板方法模式来定义这个流程,具体的请求处理由子类来完成。

六、 总结

  • 模板方法模式就像定义一个模板,规定了算法的执行流程,具体的实现细节由子类来完成! 📝
  • 主要包含抽象类和具体类两个角色! 🎭
  • 优点是代码复用、控制算法流程、提高扩展性、符合开闭原则! 👍
  • 缺点是增加复杂度、灵活性受到限制、类的数量增加! 👎
  • 适用于有一系列相似的算法,它们的执行流程基本相同,且需要让子类灵活地定制算法的某些步骤的场景! 🎯

希望这篇文章能让你彻底理解模板方法模式! 💯 祝你学习愉快! 😄
看完请看:(十 四)趣学设计模式 之 策略模式!

http://www.lryc.cn/news/546202.html

相关文章:

  • 20250225-代码笔记03-class CVRPModel AND other class
  • 【postman】postman找回接口数据
  • Milvus向量数据库部署
  • 显式 GC 的使用:留与去,如何选择?
  • 探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
  • 从零实现高并发内存池
  • 3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记
  • 【计算机网络】考研复试高频知识点总结
  • IDEA Tab 页设置多行显示
  • Spark核心之02:常用算子详解
  • Redis---LRU原理与算法实现
  • matlab 包围盒中心匹配法实现点云粗配准
  • Mermaid语法介绍
  • RHCE9.0版本笔记3:创建、查看和编辑文本文件
  • VSCode知名主题带毒 安装量900万次
  • deepseek、腾讯元宝deepseek R1、百度deepseekR1关系
  • 二、QT和驱动模块实现智能家居-----5、通过QT控制LED
  • 基于Android平台的SOME/IP测试模块 EPT-ETS
  • QT实现计算器
  • Go红队开发—语法补充
  • 二、Redis 安装与基本配置:全平台安装指南 服务器配置详解
  • halcon学习笔记1
  • 解决Docker拉取镜像超时错误,docker: Error response from daemon:
  • Masscan下载Linux安装
  • js的简单介绍
  • 神经网络 - 激活函数(Swish函数、GELU函数)
  • 关于后端使用Boolean或boolean时前端收到的参数的区别
  • 笔记:代码随想录算法训练营第35天: 01背包问题 二维、 01背包问题 一维 、LeetCode416. 分割等和子集
  • 安装 Windows Docker Desktop - WSL问题
  • Spring MVC 返回数据