当前位置: 首页 > 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处理请求的流程通常是:接收请求、处理请求、发送响应。 可以使用模板方法模式来定义这个流程,具体的请求处理由子类来完成。

六、 总结

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

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

相关文章:

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

目录 一、 啥是模板方法模式?二、 为什么要用模板方法模式?三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&a…...

20250225-代码笔记03-class CVRPModel AND other class

文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…...

【postman】postman找回接口数据

项目提测,一打开postman天塌了,所有接口都不见了。。。。conllection目录也看不见了,也导入不了同事给我发的json文件。 然后重新找同事要了一个安装包,覆盖安装了之后,在下面的目录里面找到了备份文件【C:\Users\yan…...

Milvus向量数据库部署

一、什么是Milvus Milvus 是一款开源的向量数据库,旨在帮助开发者轻松管理和检索大规模向量数据。它通过高效的索引技术,支持快速的相似度搜索,使得从海量数据中查找最接近的匹配变得简单而快捷。无论是构建推荐系统、进行图像识别还是分析自…...

显式 GC 的使用:留与去,如何选择?

目录 一、什么是显式 GC? (一) 垃圾回收的基本原理 (二)显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 (三)显式 GC 的使用场景与风险 1. JVM 如何处理显式 GC 2. 显式 GC…...

探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码

文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…...

从零实现高并发内存池

目录 一、项目介绍 二、什么是内存池? 1.池化技术 2.内存池 3.内存池解决的问题 三、malloc本身就是内存池 四、定长内存池 五、高并发内存池整体框架 六、thread cache 七、central cache 八、page cache 一、项目介绍 当前项目是实现一个高并发的内存池…...

3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

【计算机网络】考研复试高频知识点总结

文章目录 一、基础概念1、计算机⽹络的定义2、计算机⽹络的目标3、计算机⽹络的组成4、计算机⽹络的分类5、计算机⽹络的拓扑结构6、计算机⽹络的协议7、计算机⽹络的分层结构8、OSI 参考模型9、TCP/IP 参考模型10、五层协议体系结构 二、物理层1、物理层的功能2、传输媒体3、 …...

IDEA Tab 页设置多行显示

前言 日常编码中,经常需要在编辑器中同时打开多个文件,而在 IDEA 中,默认情况下,顶部的 Tab 页只显示一行,多余的文件会被隐藏起来,如下图所示: IDEA 默认 Tab 页只显示一行 这种情况下&#…...

Spark核心之02:常用算子详解

1、RDD操作详解 # 启动spark-shell spark-shell --master local[2] 1.1 基本转换 1) map map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。 举例: scala> val a sc.parallelize(1 …...

Redis---LRU原理与算法实现

文章目录 LRU概念理解LRU原理基于HashMap和双向链表实现LRURedis中的LRU的实现LRU时钟淘汰策略近似LRU的实现LRU算法的优化 Redis LRU的核心代码逻辑Redis LRU的核心代码逻辑Redis LRU的配置参数Redis LRU的优缺点Redis LRU的优缺点 LRU概念理解 LRU(Least Recentl…...

matlab 包围盒中心匹配法实现点云粗配准

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果本文由CSDN点云侠原创,原文链接,首发于:20255年3月3日。 一、算法原理 1、原理概述 包围盒中心匹配法是将源点云 P P P...

Mermaid语法介绍

一、基础语法 图表声明 使用 graph TD(自上而下)或 graph LR(从左到右)定义图表方向,节点间用箭头连接。例如: #mermaid-svg-WLayaaK0Ui6cKr5Z {font-family:"trebuchet ms",verdana,arial,sans…...

RHCE9.0版本笔记3:创建、查看和编辑文本文件

一、文件操作在RHCE中的核心地位 无论是配置系统服务(如httpd/sshd)、编写Ansible Playbook,还是分析日志文件,都离不开对文本文件的精确控制。 文件创建四大技法 1.快速创建空文件 # 标准创建方式 $ touch server.conf # 批量…...

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons,微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次,在微软实施删除后现在已安装这些扩展的开发者也会…...

deepseek、腾讯元宝deepseek R1、百度deepseekR1关系

分析与结论 区别与联系 技术基础与定制方向: DeepSeek官网R1版本:作为基础版本,通常保留通用性设计,适用于广泛的AI应用场景(如自然语言处理、数据分析等)。其优势在于技术原生性和官方直接支持。腾讯元宝…...

二、QT和驱动模块实现智能家居-----5、通过QT控制LED

在QT界面,我们要实现点击“LED”按钮就可以控制板子上的LED。LED接线图如下: 在Linux 系统里,我们可以使用2种方法去操作上面的LED: ① 使用GPIO SYSFS系统:这需要一定的硬件知识,需要设置引脚的方向、数值…...

基于Android平台的SOME/IP测试模块 EPT-ETS

在汽车产业智能化、网联化的时代浪潮中,汽车电子系统正经历着前所未有的变革。SOME/IP(Scalable service-Oriented MiddlewarE over IP)协议作为汽车电子通信领域的关键技术,其稳定性、可靠性与高效性对于整车性能的提升起着至关重…...

QT实现计算器

1:在注册登录的练习里面, 追加一个QListWidget 项目列表 要求:点击注册之后,将账号显示到 listWidget上面去 以及,在listWidget中双击某个账号的时候,将该账号删除 Widget.h #ifndef WIDGET_H #define…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

12.找到字符串中所有字母异位词

🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的&#xff…...

大数据驱动企业决策智能化的路径与实践

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...