设计模式二十三:模板方法模式(Template Method Pattern)
定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求
模版方法使用场景
- 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定的,但其中某些步骤的实现可能因情境不同而变化时,可以使用模板方法模式。这使得你可以在不改变整体结构的情况下,通过子类来定制特定步骤的实现。
- 避免代码重复:当你有多个类中的方法具有相似的步骤,但实现细节有所不同时,可以将这些相似的步骤提取到一个抽象类的模板方法中,从而避免代码重复。
- 框架或库的设计:在框架或库的设计中,通常会定义一些通用的算法框架,但具体实现需要留给使用者来完成。模板方法模式在这种情况下可以帮助定义框架的核心逻辑,同时留下扩展点供使用者进行自定义。
- 生命周期方法:当需要确保对象在特定的生命周期阶段执行特定步骤时,模板方法模式可以派上用场。比如在资源管理、初始化和销毁等场景下。
- 代码的扩展和维护:模板方法模式遵循开闭原则,当需要添加新的功能或修改算法的部分步骤时,只需要新增或修改子类,而不需要改动抽象类的代码,从而提升了代码的可扩展性和可维护性。
模版方法主要角色
- 抽象类(Abstract Class):定义了一个模板方法,它是一个包含算法框架的方法,其中的具体步骤可以是抽象方法或已实现的方法。抽象类还可以包含一些通用方法,这些方法在模板方法中被使用。
- 具体子类(Concrete Subclass):继承抽象类并实现其中的抽象方法,从而完成算法的具体步骤。每个具体子类可以根据需要实现自己的逻辑。
模版方法java代码实例
abstract class CaffeineBeverage {final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}abstract void brew();abstract void addCondiments();void boilWater() {System.out.println("Boiling water");}void pourInCup() {System.out.println("Pouring into cup");}
}class Coffee extends CaffeineBeverage {void brew() {System.out.println("Dripping coffee through filter");}void addCondiments() {System.out.println("Adding sugar and milk");}
}class Tea extends CaffeineBeverage {void brew() {System.out.println("Steeping the tea");}void addCondiments() {System.out.println("Adding lemon");}
}public class TemplateMethodPatternDemo {public static void main(String[] args) {CaffeineBeverage coffee = new Coffee();coffee.prepareRecipe();CaffeineBeverage tea = new Tea();tea.prepareRecipe();}
}
在这个示例中,CaffeineBeverage 是抽象类,定义了制作咖啡因饮料的模板方法 prepareRecipe(),以及具体步骤中的通用方法。Coffee 和 Tea 是具体子类,分别实现了 brew() 和 addCondiments() 方法。在主程序中,我们创建了咖啡和茶的实例,并调用了它们的 prepareRecipe() 方法,实现了整个制作过程
模版方法优缺点
优点:
- 代码复用性
模板方法模式鼓励将相同的代码逻辑放在抽象类中,从而避免在多个具体类中重复实现相同的代码,提高了代码的复用性。 - 高层逻辑抽象
模板方法将高层的算法逻辑抽象到抽象类中,使得具体子类只需要关注特定步骤的实现,而无需考虑整体算法的结构。 - 固定算法框架
模板方法定义了一个算法的框架,确保了整个算法的结构一致性。这有助于遵循最佳实践并减少错误。 - 易于维护
由于相同的代码逻辑集中在抽象类中,修改算法逻辑或添加新特性只需要在一个地方进行修改,减少了维护的复杂性。 - 灵活性
具体子类可以通过重写特定步骤来实现个性化需求,从而在保持整体框架不变的情况下增加灵活性。
缺点:
- 限制子类的自由度
尽管模板方法模式提供一定程度的灵活性,但子类的扩展通常被限制在模板定义的框架内。这可能导致某些情况下子类需要强行适应框架,而不是完全自由地设计。 - 增加类的数量
使用模板方法模式通常会引入抽象类和具体子类,可能会增加类的数量,增加了代码的复杂性。 - 不适合每个情况
并非所有算法都适合使用模板方法模式。如果算法的步骤变化较小或步骤变化较大,使用其他模式可能更合适。 - 复杂性增加
尽管模板方法模式可以帮助整理算法的结构,但在某些情况下可能会引入复杂性,尤其是当算法本身变得复杂时
相关文章:
设计模式二十三:模板方法模式(Template Method Pattern)
定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求 模版方法使用场景 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定…...
[Linux]进程状态
[Linux]进程状态 文章目录 [Linux]进程状态进程状态的概念阻塞状态挂起状态Linux下的进程状态孤儿进程 进程状态的概念 了解进程状态前,首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的,而是在操作系统的管理下,和其他正在运行…...
Python爬虫逆向实战案例(五)——YRX竞赛题第五题
题目:抓取全部5页直播间热度,计算前5名直播间热度的加和 地址:https://match.yuanrenxue.cn/match/5 cookie中m值分析 首先打开开发者工具进行抓包分析,从抓到的包来看,参数传递了查询参数m与f,同时页面中…...
js识别图片中的文字插件 tesseract.js
使用方法及步骤 1.安装依赖 npm i tesseract.js 2.引入插件 import { createWorker } from tesseract.js;//worker多线程引入这个import Tesseract from tesseract.js;//js单线程引入这个 3.使用插件识别图片 //使用worker线程识别(async () > {console.time()const wo…...
Linux设备驱动移植(设备数)
一、设备数 设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码 设备数语法概述 设备树文件 dts 设备树源文件 dtsi 类似于头文件,包含一些公共的…...
【移动端开发】鸿蒙系统开发入门:代码示例与详解
一、引言 随着华为鸿蒙系统的日益成熟,越来越多的开发者开始关注这一新兴的操作平台。本文旨在为初学者提供一份详尽的鸿蒙系统开发入门指南,通过具体的代码示例,引导大家逐步掌握鸿蒙开发的基本概念和技术。 二、鸿蒙系统开发基础 鸿蒙系…...
Jenkins的流水线详解
来源:u.kubeinfo.cn/ozoxBB 什么是流水线 声明式流水线 Jenkinsfile 的使用 什么是流水线 jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。…...
DIFFEDIT-图像编辑论文解读
文章目录 摘要算法Step1:计算编辑maskStep2:编码Step3:使用mask引导进行解码理论分析: 实验数据集:扩散模型:ImageNet数据集上实验消融实验IMAGEN数据集上实验COCO数据集上实验 结论 论文: 《D…...
【优选算法】—— 字符串匹配算法
在本期的字符串匹配算法中,我将给大家带来常见的两种经典的示例: 1、暴力匹配(BF)算法 2、KMP算法 目录 (一)暴力匹配(BF)算法 1、思想 2、演示 3、代码展示 (二&…...
Docker容器:docker consul的注册与发现及consul-template守护进程
文章目录 一.docker consul的注册与发现介绍1.什么是服务注册与发现2.什么是consul3.docker consul的应用场景4.consul提供的一些关键特性5.数据流向 二.consul部署1.consul服务器(192.168.198.12)(1)建立 Consul 服务启动consul后…...
Blazor 依赖注入妙用:巧设回调
文章目录 前言依赖注入特性需求解决方案示意图 前言 依赖注入我之前写过一篇文章,没看过的可以看看这个。 C# Blazor 学习笔记(10):依赖注入 依赖注入特性 只能Razor组件中注入所有Razor组件在作用域注入的都是同一个依赖。作用域可以看看我之前的文章。 需求 …...
Python 基础 -- Tutorial(三)
7、输入和输出 有几种方法可以表示程序的输出;数据可以以人类可读的形式打印出来,或者写入文件以备将来使用。本章将讨论其中的一些可能性。 7.1 更花哨的输出格式 到目前为止,我们已经遇到了两种写值的方法:表达式语句和print()函数。(第三种方法是使…...
基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)
前言:本文为手把手教学飞控核心知识点之一的姿态解算——MPU6050 姿态解算(飞控专栏第2篇)。项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算(四元数方法),搭配设计的卡尔曼滤波器与一阶低通滤波器…...
微信小程序开发教学系列(1)- 开发入门
第一章:微信小程序简介与入门 1.1 简介 微信小程序是一种基于微信平台的应用程序,可以在微信内直接使用,无需下载和安装。它具有小巧、高效、便捷的特点,可以满足用户在微信中获取信息、使用服务的需求。 微信小程序采用前端技…...
Nginx虚拟主机(server块)部署Vue项目
需求 配置虚拟主机,实现一个Nginx运行多个服务。 实现 使用Server块。不同的端口号,表示不同的服务;同时在配置中指定,Vue安装包所在的位置。 配置 Vue项目,放在 html/test 目录下。 config中的配置如下…...
JAVA开发环境接口swagger-ui使用总结
一、前言 swagger-ui是java开发中生产api说明文档的插件,这是后端工程师和前端工程师联调接口的桥梁。生成的文档就减少了很多没必要的沟通提高开发和测试效率。 二、 swagger-ui的使用 1、引入maven依赖 <dependency><groupId>io.springfox</grou…...
mongodb 数据库管理(数据库、集合、文档)
目录 一、数据库操作 1、创建数据库 2、删除数据库 二、集合操作 1、创建集合 2、删除集合 三、文档操作 1、创建文档 2、 插入文档 3、查看文档 4、更新文档 1)update() 方法 2)replace() 方法 一、数据库操作 1、创建数据库 创建数据库…...
分布式与集群的定义及异同
分布式与集群的定义及异同 分布式定义优点不足 集群优点不足 异同 分布式 定义 分布式是指将一个系统或应用程序分散到多个计算机或服务器上进行处理和管理的技术。它是指多个系统协同合作完成一个特定任务的系统。例如,可以将一个大业务拆分成多个子业务…...
电脑端teams一直在线小程序,简单好用易上手
居家办公的你,会不会想要摸鱼!!会不会想要下楼拿快递!!会不会想要出去下馆子!!!然而,teams的5分钟不操作电脑状态就变为离开大大的阻挡了你幸福生活的脚步!&a…...
YOLOv5算法改进(4)— 添加CA注意力机制
前言:Hello大家好,我是小哥谈。注意力机制是近年来深度学习领域内的研究热点,可以帮助模型更好地关注重要的特征,从而提高模型的性能。在许多视觉任务中,输入数据通常由多个通道组成,例如图像中的RGB通道或…...
瑞萨RL78/G16开发板与EZ-CUBE3仿真器连接调试全攻略
1. 项目概述与核心价值 最近在折腾瑞萨的RL78系列MCU,手头正好有一块RL78/G16的快速原型开发板和一个EZ-CUBE3仿真器。对于刚接触瑞萨生态的朋友来说,如何把这套硬件正确地连接起来,并成功跑通第一个LED闪烁程序,往往是入门路上的…...
B站缓存视频转换全攻略:3分钟学会m4s转MP4无损转换
B站缓存视频转换全攻略:3分钟学会m4s转MP4无损转换 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过这样的情况&#x…...
AI Agent Skill 从入门到精通:定义、结构、调用链路与底层原理
一篇帮你从"知道 Skill 这个词"到"能独立设计生产级 Skill"的系统教学,含 3 个完整实战案例。阅读提示适合谁看:正在做或准备做 AI Agent 开发的工程师,尤其是从传统后端 / 数据仓库转过来的同学看完能做什么:…...
桌面整理神器:NoFences让你的Windows桌面焕然一新 [特殊字符]
桌面整理神器:NoFences让你的Windows桌面焕然一新 🚀 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是不是也厌倦了Windows桌面上杂乱无章的图标&a…...
Windows资源管理器STL缩略图革命:3D模型可视化管理的终极解决方案
Windows资源管理器STL缩略图革命:3D模型可视化管理的终极解决方案 【免费下载链接】STL-thumbnail Shellextension for Windows File Explorer to show STL thumbnails 项目地址: https://gitcode.com/gh_mirrors/st/STL-thumbnail 还在为海量STL文件的管理而…...
手把手教你用逻辑分析仪抓取RF433遥控器信号(附我家窗帘遥控器完整解码过程)
手把手教你用逻辑分析仪抓取RF433遥控器信号(附我家窗帘遥控器完整解码过程) 无线遥控技术早已渗透进日常生活,从车库门到智能窗帘,这些设备背后的RF433MHz通信协议却像黑匣子般神秘。本文将用一台百元级的逻辑分析仪和常见的超外…...
如何在10分钟内搭建自己的游戏串流服务器:Sunshine开源游戏串流完整教程
如何在10分钟内搭建自己的游戏串流服务器:Sunshine开源游戏串流完整教程 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想在任何设备上玩PC游戏吗?Sunshin…...
如何快速解决AKShare股票数据获取失败:完整的数据采集优化指南
如何快速解决AKShare股票数据获取失败:完整的数据采集优化指南 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirror…...
AI第一次科研竞赛中击败人类!Opus 4.7狂飙2930步创世界纪录
来源:新智元Prime Intellect把Opus 4.7和GPT 5.5关进H200集群,不给人类指导,跑了1万次实验。结果:AI第一次在科研竞赛中打破人类纪录。2930步,递归自改进的卢比孔河,被跨过了。历经1.4万小时H200算力测试与…...
影像技术实战05:视频上传后无法在线播放?MP4 封装、编码兼容与 FastStart 修复方案
影像技术实战05:视频上传后无法在线播放?MP4 封装、编码兼容与 FastStart 修复方案 一、问题场景:视频明明是 MP4,为什么网页还是播不了? 在很多视频系统里,用户上传视频后,后台保存文件&#x…...
