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

 🎉🎉欢迎光临🎉🎉

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

🌟特别推荐给大家我的最新专栏《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 {@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,并将具体的连接、查询和断开连接的逻辑留给具体子类实现。

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

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

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

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

相关文章

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

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

深度解析 Netty 架构与原理

一共 28661字,耐心看完。 在阅读本文前最好有 Java 的 IO 编程经验(知道 Java 的各种 IO 流),以及 Java 网络编程经验(用 ServerSocket 和 Socket 写过 demo),并对 Java NIO 有基本的认识&…

linux---内存管理

一 虚拟内存 即使是现代操作系统中,内存依然是计算机中很宝贵的资源,看看你电脑几个T固态硬盘,再看看内存大小就知道了。 为了充分利用和管理系统内存资源,Linux采用虚拟内存管理技术,利用虚拟内存技术让每个进程都有…

计算机网络——09Web-and-HTTP

Web and HTTP 一些术语 Web页:由一些对象组成对象可以是HTML文件、JPEG图像,JAVA小程序,声音剪辑文件等Web页含有一个基本的HTML文件,该基本HTML文件又包含若干对象的引用(链接)通过URL对每个对象进行引用…

权限提升:利用Linux错配提权

目录 Linux权限基础 Linux用户权限 Linux文件权限 特殊的Linux文件权限 Linux本机信息收集 Linux错配提权 crontab计划任务提权 SUID提权 Linux权限基础 Linux用户权限 在Linux中,根据权限的不同,大致可以分为三种:超级用户&#x…

npm install 安装依赖如何加速

在使用npm安装依赖时,有几种方法可以加速这一过程,尤其是在面临网络限制或npm官方源速度慢的情况下。以下是一些常用的加速技巧: 1. 使用国内镜像源 国内有几个镜像源可以提供更快的下载速度,例如淘宝npm镜像。你可以通过以下命…

通过QT制作一个模仿微信主界面的界面(不要求实现具体通信功能)

main.cpp #include "widget.h" #include "second.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();//实例化第二个界面Second s;QObject::connect(&w, &Widget::my_jump, &…

Linux线程库封装

一 MyThread.hpp #pragma once #include<pthread.h> #include<iostream> #include<unistd.h> #include<string> #include<ctime>typedef void (*callback_t)(); static int num 1; //任务和线程绑定 class Thread {static void* Routine(void …

力扣精选算法100道——矩阵区域和 (前缀和专题)

目录 &#x1f388;了解题意 &#x1f388;算法原理 &#x1f388;实现代码 &#x1f388;了解题意 给定一个大小为 m x n 的矩阵 mat 和一个整数 k&#xff0c;你需要计算一个新的矩阵 answer&#xff0c;其中每个 answer[i][j] 表示矩阵 mat 中以坐标 (i, j) 为中心、边…

论文阅读-Pegasus:通过网络内一致性目录容忍分布式存储中的偏斜工作负载

论文名称&#xff1a;Pegasus: Tolerating Skewed Workloads in Distributed Storage with In-Network Coherence Directories 摘要 高性能分布式存储系统面临着由于偏斜和动态工作负载引起的负载不平衡的挑战。本文介绍了Pegasus&#xff0c;这是一个利用新一代可编程交换机…

CSS 评分器星星效果

<template><view class="rating"><!-- 5颗星 --><input value="5" name="rating" id="star5" type="radio"><label for="star5"></label><!-- 4颗星 --><input val…

【后端高频面试题--设计模式下篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--设计模式下篇 后端高频面试题--设计模式上篇设计模式总览模板方法模式怎么理解模…

探索机器学习:定义、算法及应用领域

目录 前言1 机器学习的定义2 机器学习算法2.1 监督学习2.2 无监督学习2.3 强化学习 3 机器学习的应用3.1 智能搜索3.2 医疗诊断3.3 无人驾驶 结语 前言 机器学习&#xff0c;源自Arthur Samuel的定义&#xff0c;赋予计算机通过领域学习的能力&#xff0c;使其在不需要明确程序…

【王道数据结构】【chapter5树与二叉树】【P158t10】

已知二叉树以二叉链表存储&#xff0c;编写算法完成&#xff1a;对于树种每个元素值为x的结点&#xff0c;删除以它为根的子树&#xff0c;并释放相应的空间 #include <iostream> #include <queue> typedef struct treenode{char data;struct treenode *left;struc…

2月7日作业

分别通过select、多进程、多线程实现一个并发服务器 #include <myhd.h> #define IP "192.168.250.100" #define PORT 8888 int deal_cli_msg(int newfd,struct sockaddr_in cin) {char buf[128] "";while(1){bzero(buf,sizeof(buf));int res recv…

使用Word Embedding+Keras进行自然语言处理NLP

目录 介绍&#xff1a; one-hot&#xff1a; pad_sequences: 建模: 介绍&#xff1a; Word Embedding是一种将单词表示为低维稠密向量的技术。它通过学习单词在文本中的上下文关系&#xff0c;将其映射到一个连续的向量空间中。在这个向量空间中&#xff0c;相似的单词在空间…

2024年智能算法优化PID参数,ITAE、ISE、ITSE、IAE四种适应度函数随意切换,附MATLAB代码...

PID 参数整定就是确定比例系数&#xff08;Kp &#xff09;、积分系数&#xff08;Ki&#xff09;和微分系数&#xff08;Kd &#xff09;的过程&#xff0c;以便使 PID 控制器能够在系统中实现稳定、快速、准确的响应。 本期的主题 采用四种2024年的智能优化算法优化PID的三个…

【开源】JAVA+Vue+SpringBoot实现毕业生追踪系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登陆注册模块2.2 学生基本配置模块2.3 就业状况模块2.4 学历深造模块2.5 信息汇总分析模块2.6 校友论坛模块 三、系统设计3.1 用例设计3.2 实体设计 四、系统展示五、核心代码5.1 查询我的就业状况5.2 初始化就业状况5.…

《Git 简易速速上手小册》第6章:Git 在持续集成/持续部署(CI/CD)中的应用(2024 最新版)

文章目录 6.1 CI/CD基础6.1.1 基础知识讲解6.1.2 重点案例&#xff1a;为 Python Web 应用实现 CI/CD6.1.3 拓展案例 1&#xff1a;自动化部署到云平台6.1.4 拓展案例 2&#xff1a;使用 Docker 容器化部署 6.2 Git 与自动化测试6.2.1 基础知识讲解6.2.2 重点案例&#xff1a;为…

numpy 查漏补缺

1. iterating 2. 3. 4. 5. 6. 7. 8. 9.