【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)
🎉🎉欢迎光临🎉🎉
🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀
🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀
本专栏纯属为爱发电永久免费!!!
这是苏泽的个人主页可以看到我其他的内容哦👇👇
努力的苏泽
http://suzee.blog.csdn.net/
目录
深入理解设计模式之模板方法(Template Method)
模板方法模式概述
模板方法模式的结构
模板方法模式的实现步骤
模板方法模式的应用场景
模板方法模式的优缺点
示例:使用模板方法模式实现数据访问
深入理解设计模式之模板方法(Template Method)
简介:
在软件开发中,设计模式扮演着重要的角色,它们提供了一种经过验证的解决方案,帮助我们解决常见的设计问题。而设计模式能够让我们的代码更加具有的兼容性和拓展性。本文将重点介绍设计模式中的模板方法(Template Method)模式,并探讨如何将其与Spring框架相结合,以实现灵活且可扩展的应用程序设计。
模板方法模式概述
模板方法模式是一种行为型设计模式,用于定义一个算法的骨架,将具体的实现延迟到子类中。模板方法模式允许我们定义一个抽象类,其中包含一个模板方法和一些抽象方法,供具体子类实现。这样,通用的操作被封装在模板方法中,而具体的实现细节则由子类来完成。
模板方法模式的结构
模板方法模式由三个核心组成部分构成:抽象类、具体类和模板方法。
抽象类(Abstract Class)扮演着模板方法模式的中心角色。它定义了模板方法,该方法提供了算法的骨架,并调用抽象方法和具体方法来完成操作。
具体类(Concrete Class)继承抽象类并实现其中的抽象方法,完成具体的实现细节。
模板方法(Template Method)是抽象类中定义的方法,它定义了算法的骨架。模板方法调用抽象方法和具体方法来完成操作,具体的实现延迟到具体类中。
模板方法模式的实现步骤
实现模板方法模式的步骤如下:
-
定义抽象类:创建一个抽象类,并在其中定义模板方法。模板方法提供算法的骨架,它调用抽象方法和具体方法来完成操作。
-
定义抽象方法:在抽象类中定义抽象方法,以供具体类实现。这些抽象方法表示算法中的可变部分。如下:这是一个商城项目的业务场景首先,定义抽象类
AbstractShoppingCart,其中包含模板方法processOrder,以及抽象方法calculateTotalPrice和pay://定义抽象类AbstractShoppingCart,其中包含模板方法processOrder,以及抽象方法calculateTotalPrice和pay: abstract class AbstractShoppingCart {public final void processOrder() {addToCart();calculateTotalPrice();pay();}protected abstract void addToCart();protected abstract void calculateTotalPrice();protected abstract void pay(); } -
创建具体类:创建具体的子类,继承抽象类,并实现其中的抽象方法。具体类完成具体的实现细节。
-
重写模板方法:根据需要,在具体类中重写模板方法,或者新增特定步骤的方法。这样,可以根据具体需求来定制算法的实现。如下:创建具体类
SuishiShoppingCart,继承AbstractShoppingCart,并实现其中的抽象方法://然后,创建具体类SuishiShoppingCart,继承AbstractShoppingCart,并实现其中的抽象方法: class SuishiShoppingCart extends AbstractShoppingCart {protected void addToCart() {System.out.println("将商品加入购物车");}protected void calculateTotalPrice() {System.out.println("计算总价");}protected void pay() {System.out.println("完成支付");} }
最后,我们可以使用如下代码来测试和调用模板方法:
public class Main {public static void main(String[] args) {AbstractShoppingCart shoppingCart = new SuishiShoppingCart();shoppingCart.processOrder();}
}
输出结果将会是:
将商品加入购物车
计算总价
完成支付
在上述示例中,AbstractShoppingCart是抽象类,定义了模板方法processOrder,以及需要具体子类实现的抽象方法addToCart、calculateTotalPrice和pay。SuishiShoppingCart是具体子类,继承抽象类并实现了抽象方法。在Main类中,我们创建了SuishiShoppingCart的实例,并调用processOrder方法来执行整个购物流程。
通过模板方法模式,我们可以将购物车的通用操作(加入购物车、计算总价、支付)封装在抽象类中,而具体的实现细节则由具体子类来实现。这样可以提高代码的复用性和可维护性
模板方法模式的应用场景
模板方法模式在许多场景下都有应用,包括:
-
框架和库的设计:模板方法模式常用于框架和库的设计中,它定义了框架的基本骨架,留下了一些可变的实现细节供使用者定制。
-
一次性实现一个算法的不变部分:模板方法模式允许我们将算法的不变部分放在父类中实现,而将可变部分留给子类来实现。这样,我们可以避免重复的代码,并提高代码的可维护性。
-
多个类具有相似的行为:如果多个类具有相似的行为,但其具体实现有所不同,我们可以将这些行为的共同部分提取到抽象类的模板方法中,而将变化的部分交给具体子类实现。
模板方法模式的优缺点
模板方法模式具有以下优点:
-
代码复用:模板方法模式提供了一种代码复用的方式,将通用的操作放在抽象类中实现,避免了重复编写相同的代码。
-
扩展性:通过定义抽象类和抽象方法,模板方法模式允许我们在不修改现有代码的情况下扩展算法的实现。只需创建新的具体类来实现抽象方法即可。
-
易于维护:模板方法模式将算法的骨架和具体实现分离,使代码结构更清晰。这样,当需求变化时,我们只需关注具体类的实现细节,而无需修改抽象类中的模板方法。
然而,模板方法模式也存在一些缺点:
-
对子类的限制:由于模板方法模式基于继承关系,子类必须遵循抽象类定义的算法骨架。这可能限制了子类的灵活性。
-
设计复杂性增加:使用模板方法模式会增加一定的设计复杂性。需要仔细考虑抽象类和具体类之间的关系,并确保模板方法和抽象方法的正确实现。
在与Spring框架结合使用时,模板方法模式可以更好地利用Spring框架的特性,例如使用Spring提供的模板类来实现通用的操作,同时允许我们通过子类来实现具体的业务逻辑。这种结合可以提供一种灵活且易于扩展的方式来开发应用程序。下面我们将通过一个示例来解释以上内容。
示例:使用模板方法模式实现数据访问
假设我们正在开发一个基于Spring框架的数据访问模块,其中包含对不同数据库的访问操作。我们可以使用模板方法模式来实现通用的数据库访问操作,并将特定的操作留给具体子类实现。
首先,我们创建一个抽象类AbstractDataAccess作为模板类,其中定义了模板方法execute:
public abstract class AbstractDataAccess {public void execute() {connect();performQuery();disconnect();}protected abstract void connect();protected abstract void performQuery();protected abstract void disconnect();
}
在抽象类中,我们定义了三个抽象方法:connect、performQuery和disconnect,它们表示数据库访问的可变部分。
然后,我们创建具体子类SqlServerDataAccess和MySqlDataAccess,分别继承AbstractDataAccess并实现抽象方法:
public class SqlServerDataAccess extends AbstractDataAccess {@Overrideprotected void connect() {// SQL Server数据库连接逻辑}@Overrideprotected void performQuery() {// SQL Server数据库查询逻辑}@Overrideprotected void disconnect() {// SQL Server数据库断开连接逻辑}
}
public class MySqlDataAccess extends AbstractDataAccess {@Overrideprotected void connect() {// MySQL数据库连接逻辑}@Overrideprotected void performQuery() {// MySQL数据库查询逻辑}@Overrideprotected void disconnect() {// MySQL数据库断开连接逻辑}
}
在具体子类中,我们实现了各自数据库的连接、查询和断开连接的具体逻辑。
最后,我们可以在应用程序中使用这些具体子类来执行数据库访问操作:
public class Main {public static void main(String[] args) {AbstractDataAccess dataAccess = new SqlServerDataAccess();dataAccess.execute();dataAccess = new MySqlDataAccess();dataAccess.execute();}
}
通过以上示例,我们可以看到模板方法模式的应用。抽象类AbstractDataAccess定义了数据库访问的模板方法execute,并将具体的连接、查询和断开连接的逻辑留给具体子类实现。
在应用程序中,我们可以根据实际需要选择具体的子类(如SqlServerDataAccess或MySqlDataAccess)来执行数据库访问操作。这样,我们可以通过模板方法模式实现通用的数据库访问逻辑,并在具体子类中实现特定数据库的操作细节。
使用模板方法模式可以将通用的操作封装在抽象类中,提高代码的复用性和可维护性。同时,它也允许我们通过具体子类来扩展和定制算法的实现。在与Spring框架结合使用时,模板方法模式可以更好地利用Spring提供的特性和功能,实现灵活且可扩展的应用程序设计。
相关文章:
【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)
🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀…...
Windows搭建docker+k8s
安装Docker Desktop 从官网下载,然后直接安装即可,过程很简单,一直Next就行。 有一点需要注意就是要看好对应的版本,因为后边涉及到版本的问题。 https://www.docker.com/products/docker-desktop 安装完成,双击图…...
年假作业10
一、选择题 BBDBACCCAD 二、填空题 1,4,13,40 3715 358 5 2 6 1 5 4 8 2 0 2 三、编程题 1、 #include <iostream> #include<array> #include <limits> using namespace std; int main() {array<int,10> score;array<int,10>::iterat…...
[ai笔记4] 将AI工具场景化,应用于生活和工作
欢迎来到文思源想的AI空间,这是技术老兵重学ai以及成长思考的第4篇分享内容! 转眼已经到了大年初三,但是拜年的任务还只完成了一半,准备的大部头的书,现在也就看了两本,还好AI笔记通过每天早起坚持了下来。…...
【生产实测可用】Redis修改集群弱口令
起因 漏扫redis连接发现弱口令需要修改 先连上去看看是空口令还是弱口令 redis-cli -p 6379 -h a.b.c.d info sentinel找到启动服务器的配置文件 cp -av /app/redis-7001/redis.conf /app/redis-7001/redis.conf.bak20240207 echo "requirepass 口令" >>/a…...
备战蓝桥杯---图论基础理论
图的存储: 1.邻接矩阵: 我们用map[i][j]表示i--->j的边权 2.用vector数组(在搜索专题的游戏一题中应用过) 3.用邻接表: 下面是用链表实现的基本功能的代码: #include<bits/stdc.h> using nam…...
[office] excel2003进行可视性加密的方法 #媒体#其他#知识分享
excel2003进行可视性加密的方法 Excel如何对重要文件进行可视性的加密处理呢?下面是小编带来的关于excel2003进行可视性加密的方法,希望阅读过后对你有所启发! excel2003进行可视性加密的方法: 可视性加密步骤1:打开你要加密的excel2003文档…...
算法沉淀——分治算法(leetcode真题剖析)
算法沉淀——分治算法 快排思想01.颜色分类02.排序数组03.数组中的第K个最大元素04.库存管理 III 归并思想01.排序数组02.交易逆序对的总数03.计算右侧小于当前元素的个数04.翻转对 分治算法是一种解决问题的算法范式,其核心思想是将一个大问题分解成若干个小问题&a…...
Qt 进程守护程序
Qt 进程守护程序 简单粗暴的监控,方法可整合到其他代码。 一、windows环境下 1、进程查询函数 processCount函数用于查询系统所有运行的进程中该进程运行的数量,比如启动了5个A进程,该函数查询返回的结果就为5。 windows下使用了API接口查询…...
Linux_文件系统
假定外部存储设备为磁盘,文件如果没有被使用,那么它静静躺在磁盘上,如果它被使用,则文件将被加载进内存中。故此,可以将文件分为内存文件和磁盘文件。 内存文件 磁盘文件 软、硬链接 一.内存文件 1.1 c语言的文件接口 …...
算法沉淀——链表(leetcode真题剖析)
算法沉淀——链表 01.两数相加02.两两交换链表中的节点03.重排链表04.合并 K 个升序链表05.K个一组翻转链表 链表常用技巧 1、画图->直观形象、便于理解 2、引入虚拟"头节点" 3、要学会定义辅助节点(比如双向链表的节点插入) 4、快慢双指针…...
Flink从入门到实践(一):Flink入门、Flink部署
文章目录 系列文章索引一、快速上手1、导包2、求词频demo(1)要读取的数据(2)demo1:批处理(离线处理)(3)demo2 - lambda优化:批处理(离线处理&…...
python分离字符串 2022年12月青少年电子学会等级考试 中小学生python编程等级考试二级真题答案解析
目录 python分离字符串 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python分离字符串 2022年12月 python编程等级考试级编程题 一、题目要…...
Excel练习:折线图突出最大最小值
Excel练习:折线图突出最大最小值 要点:NA值在折现图中不会被绘制,看似一条线,实际是三条线。换成0值和""都不行。 查看所有已分享Excel文件-阿里云 学习的这个视频:Excel折线图,…...
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItem组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItem组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItem组件 用来展示菜单Menu中具体的item菜单项。 子组件 无。 接口 Men…...
Mockito测试框架中的方法详解
这里写目录标题 第一章、模拟对象1.1)①mock()方法:1.2)②spy()方法: 第二章、模拟对象行为2.1)模拟方法调用①when()方法 2.2)模拟返回值②thenReturn(要返回的值)③doReturn() 2.3)模拟并替换…...
Atcoder ABC339 A - TLD
TLD 时间限制:2s 内存限制:1024MB 【原题地址】 所有图片源自Atcoder,题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例输入1】 atcoder.jp【样例输出1】 jp【样例说明…...
企业级DevOps实战
第1章 Zookeeper服务及MQ服务 Zookeeper(动物管理员)是一个开源的分布式协调服务,目前由Apache进行维护。 MQ概念 MQ(消息队列)是一种应用程序之间的通信方法,应用程序通过读写出入队列的消息࿰…...
C++中的new和delete
1.new和delete的语法 我们知道C语言的内存管理方式是malloc、calloc、realloc和free,而我们的C中除了可以使用这些方式之外还可以选择使用new和delete来进行内存管理。 new和delete的主要语法如下 从上面的代码我们只能知道new要比malloc好写一些,但是其…...
rtt设备io框架面向对象学习-dac设备
目录 1.dac设备基类2.dac设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.dac设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类 struct rt_da…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
