【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)

news2025/1/17 22:53:36

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀

本专栏纯属为爱发电永久免费!!!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/

目录

深入理解设计模式之模板方法(Template Method)

模板方法模式概述

模板方法模式的结构

模板方法模式的实现步骤

模板方法模式的应用场景

模板方法模式的优缺点

示例:使用模板方法模式实现数据访问


深入理解设计模式之模板方法(Template Method)

简介:
在软件开发中,设计模式扮演着重要的角色,它们提供了一种经过验证的解决方案,帮助我们解决常见的设计问题。而设计模式能够让我们的代码更加具有的兼容性和拓展性。本文将重点介绍设计模式中的模板方法(Template Method)模式,并探讨如何将其与Spring框架相结合,以实现灵活且可扩展的应用程序设计。

模板方法模式概述

模板方法模式是一种行为型设计模式,用于定义一个算法的骨架,将具体的实现延迟到子类中。模板方法模式允许我们定义一个抽象类,其中包含一个模板方法和一些抽象方法,供具体子类实现。这样,通用的操作被封装在模板方法中,而具体的实现细节则由子类来完成。

模板方法模式的结构

模板方法模式由三个核心组成部分构成:抽象类、具体类和模板方法。

抽象类(Abstract Class)扮演着模板方法模式的中心角色。它定义了模板方法,该方法提供了算法的骨架,并调用抽象方法和具体方法来完成操作。

具体类(Concrete Class)继承抽象类并实现其中的抽象方法,完成具体的实现细节。

模板方法(Template Method)是抽象类中定义的方法,它定义了算法的骨架。模板方法调用抽象方法和具体方法来完成操作,具体的实现延迟到具体类中。

模板方法模式的实现步骤

实现模板方法模式的步骤如下:

  1. 定义抽象类:创建一个抽象类,并在其中定义模板方法。模板方法提供算法的骨架,它调用抽象方法和具体方法来完成操作。

  2. 定义抽象方法:在抽象类中定义抽象方法,以供具体类实现。这些抽象方法表示算法中的可变部分。如下:这是一个商城项目的业务场景首先,定义抽象类AbstractShoppingCart,其中包含模板方法processOrder,以及抽象方法calculateTotalPricepay

    //定义抽象类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();
    }
  3. 创建具体类:创建具体的子类,继承抽象类,并实现其中的抽象方法。具体类完成具体的实现细节。

  4. 重写模板方法:根据需要,在具体类中重写模板方法,或者新增特定步骤的方法。这样,可以根据具体需求来定制算法的实现。如下:创建具体类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,以及需要具体子类实现的抽象方法addToCartcalculateTotalPricepaySuishiShoppingCart是具体子类,继承抽象类并实现了抽象方法。在Main类中,我们创建了SuishiShoppingCart的实例,并调用processOrder方法来执行整个购物流程。

通过模板方法模式,我们可以将购物车的通用操作(加入购物车、计算总价、支付)封装在抽象类中,而具体的实现细节则由具体子类来实现。这样可以提高代码的复用性可维护性

模板方法模式的应用场景

模板方法模式在许多场景下都有应用,包括:

  1. 框架和库的设计:模板方法模式常用于框架和库的设计中,它定义了框架的基本骨架,留下了一些可变的实现细节供使用者定制。

  2. 一次性实现一个算法的不变部分:模板方法模式允许我们将算法的不变部分放在父类中实现,而将可变部分留给子类来实现。这样,我们可以避免重复的代码,并提高代码的可维护性。

  3. 多个类具有相似的行为:如果多个类具有相似的行为,但其具体实现有所不同,我们可以将这些行为的共同部分提取到抽象类的模板方法中,而将变化的部分交给具体子类实现。

模板方法模式的优缺点

模板方法模式具有以下优点:

  1. 代码复用:模板方法模式提供了一种代码复用的方式,将通用的操作放在抽象类中实现,避免了重复编写相同的代码。

  2. 扩展性:通过定义抽象类和抽象方法,模板方法模式允许我们在不修改现有代码的情况下扩展算法的实现。只需创建新的具体类来实现抽象方法即可。

  3. 易于维护:模板方法模式将算法的骨架和具体实现分离,使代码结构更清晰。这样,当需求变化时,我们只需关注具体类的实现细节,而无需修改抽象类中的模板方法。

然而,模板方法模式也存在一些缺点:

  1. 对子类的限制:由于模板方法模式基于继承关系,子类必须遵循抽象类定义的算法骨架。这可能限制了子类的灵活性。

  2. 设计复杂性增加:使用模板方法模式会增加一定的设计复杂性。需要仔细考虑抽象类和具体类之间的关系,并确保模板方法和抽象方法的正确实现。

在与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();
}

在抽象类中,我们定义了三个抽象方法:connectperformQuerydisconnect,它们表示数据库访问的可变部分。

然后,我们创建具体子类SqlServerDataAccessMySqlDataAccess,分别继承AbstractDataAccess并实现抽象方法:

public class SqlServerDataAccess extends AbstractDataAccess {
    
    @Override
    protected void connect() {
        // SQL Server数据库连接逻辑
    }
    
    @Override
    protected void performQuery() {
        // SQL Server数据库查询逻辑
    }
    
    @Override
    protected void disconnect() {
        // SQL Server数据库断开连接逻辑
    }
}
public class MySqlDataAccess extends AbstractDataAccess {
    
    @Override
    protected void connect() {
        // MySQL数据库连接逻辑
    }
    
    @Override
    protected void performQuery() {
        // MySQL数据库查询逻辑
    }
    
    @Override
    protected 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,并将具体的连接、查询和断开连接的逻辑留给具体子类实现。

在应用程序中,我们可以根据实际需要选择具体的子类(如SqlServerDataAccessMySqlDataAccess)来执行数据库访问操作。这样,我们可以通过模板方法模式实现通用的数据库访问逻辑,并在具体子类中实现特定数据库的操作细节。

使用模板方法模式可以将通用的操作封装在抽象类中,提高代码的复用性和可维护性。同时,它也允许我们通过具体子类来扩展和定制算法的实现。在与Spring框架结合使用时,模板方法模式可以更好地利用Spring提供的特性和功能,实现灵活且可扩展的应用程序设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1447709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#使用密封类密封用户信息

目录 一、涉及到的知识点 1.密封类定义 2.何时使用密封类 3.使用密封类的注意事项 二、实例1 三、实例2 1.源码 2.生成效果 在C#中,密封类(sealed class)是一种不能被其他类继承的类。它用于防止其他类继承它的功能和属性。 一、涉…

键盘重映射禁用 CtrlAltDel 键的利弊

目录 前言 一、Scancode Map 的规范 二、禁用 CtrlAltDel 的方法及其缺陷 三、编程实现和测试 3.1 C 实现的简易修改工具 3.2 C# 实现的窗口工具 四、总结 本文属于原创文章,转载请注明出处: https://blog.csdn.net/qq_59075481/article/details…

如何才能学好JVM?——零基础入门篇

1. JVM是什么? JVM是Java Virtual Machine的简称,它是一个虚拟的计算机,专门为执行Java程序而设计。 你可以想象它是一个能够运行Java字节码的平台,无论你的程序在Windows、Mac还是Linux上,它们都能通过JVM在这些系统…

单调队列优化DP问题

目录 1.滑动窗口 2.最大子序和 3.旅行问题 4.烽火传递 5.绿色通道 6.修剪草坪 7.理想的正方形 1.滑动窗口 154.给定一个大小为 n≤106 的数组。 有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向…

RBF神经网络中的RBF的英文全称是什么,是用来干什么的?

问题描述:RBF神经网络中的RBF的英文全称是什么,是用来干什么的? 问题解答: RBF神经网络中的RBF是径向基函数(Radial Basis Function)的缩写。径向基函数是一种在机器学习和模式识别中常用的函数类型&…

Peter算法小课堂—区间模型

Peter Pan来啦…… 最大不重叠区间数 二话不说,先来一道题 大家想想怎么贪心?我们可以将每一个美食摊位抽象成一个区间,区间左端点为开始排队时间,右端点为结束排队时间。其中,时间信息可以用数轴表示。 额……我们…

【Spring MVC篇】Cookie和Session的获取 Header的获取

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌 Cookie是客户端保存用…

【知识整理】产研中心岗位评定标准之测试岗位

为贯彻执行集团数字化转型的需要,该知识库将公示集团组织内各产研团队不同角色成员的职务“职级”岗位的评定标准; 一、定级定档目的 通过对公司现有岗位及相应岗位员工的工作能力、工作水平进行客观公正评定,确定各岗位的等级及同等级岗位员工对应的档级,从而为员工以后的晋升…

M3芯片支持追光效果吗?苹果电脑上值得玩的游戏大作有什么? Mac电脑热门游戏推荐 苹果电脑玩幻兽帕鲁 crossover软件安装

M3是苹果最新发布的芯片,它采用了业界领先的3纳米工艺,能够提供更快的速度和更高的能效。苹果电脑是一种高端的个人电脑,它也有着不少优秀的游戏大作,能够给玩家带来不同的游戏体验。那么,M3支持追光效果吗&#xff1f…

【AutoML】AutoKeras 进行 RNN 循环神经网络训练

由于最近这些天都在人工审查之前的哪些问答数据,所以迟迟都没有更新 AutoKeras 的训练结果。现在那部分数据都已经整理好了,20w 的数据最后能够使用的高质量数据只剩下 2k。这 2k 的数据已经经过数据校验并且对部分问题的提问方式和答案内容进行了不改变…

前端秘法引言(配置vscode, 以及html的基础)

目录 一.配置环境vscode 二.配置插件 三.vscode的实用小技巧 四.标题段落换行标签 五.格式化标签 一.配置环境vscode vscode官网https://code.visualstudio.com/ 点击右上角的download 根据不同的操作系统进行下载安装,我这里选的是Windows x64 安装好后打开,点击左上角的…

React官网摘抄

https://react.dev/learn 1、组件名称大写 2、变量,用{} vue中用{{}} react中用{}3、遍历 4、state使用

Python算法题集_LRU 缓存

Python算法题集_LRU 缓存 题146:LRU 缓存1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【队列字典】2) 改进版一【有序字典】3) 改进版二【双向链表字典】 4. 最优算法 本文为Python算法题集之一的代码示例 题146:LRU …

基于AI Agent探讨:安全领域下的AI应用范式

先说观点:关于AI应用,通常都会聊准召。但在安全等模糊标准的场景下,事实上不存在准召的定义。因此,AI的目标应该是尽可能的“像人”。而想要评价有多“像人”,就先需要将人的工作数字化。而AI Agent是能够将数字化、自…

C++ //练习 6.27 编写一个函数,它的参数是initializer_list<int>类型的对象,函数的功能是计算列表中所有元素的和。

C Primer(第5版) 练习 6.27 练习 6.27 编写一个函数,它的参数是initializer_list类型的对象,函数的功能是计算列表中所有元素的和。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块…

现代化端口扫描工具RustScan

今天是大年初五,喜迎财神 ,祝大家✔️顺风顺水 ✔️诸事如意 ✔️财源滚滚 ✔️大吉大利 顺便提一下,老苏的博客启用了新域名: https://laosu.tech 什么是 RustScan ? RustScan 是一款现代化的端口扫描器。能快速找到端…

学生成绩管理系统|基于Springboot的学生成绩管理系统设计与实现(源码+数据库+文档)

学生成绩管理系统目录 目录 基于Springboot的学生成绩管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能模块 2、学生功能模块 3、教师功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源…

选台灯的正确指标?分享考公必备的护眼台灯

台灯作为家居类不可或缺的一种照明灯具,在我们的日常生活中发挥着重要作用,不管是学生党学习阅读,还是办公族加班工作等等,都离不开它的存在。不过台灯也是有着优劣之分的,如果使用了一款质量不好的台灯,时…

CTFshow web(php命令执行59-67)

web59 <?php /* # -*- coding: utf-8 -*- # Author: Lazzaro # Date: 2020-09-05 20:49:30 # Last Modified by: h1xa # Last Modified time: 2020-09-07 22:02:47 # email: h1xactfer.com # link: https://ctfer.com */ // 你们在炫技吗&#xff1f; if(isset($_POST…

AutoGen实战应用(三):多代理协作的数据可视化

之前我完成了关于AutoGen的两篇博客&#xff0c;还没有读过这两篇博客的朋友可以先阅读以下&#xff0c;这样有助于对AutoGen的初步了解&#xff1a; AutoGen实战应用(一)&#xff1a;代码生成、执行和调试_autogen 支持的model-CSDN博客 AutoGen实战应用(二)&#xff1a;多代…