Spring设计模式-实战篇之模板方法模式

什么是模板方法模式?

        模板方法模式用于定义一个算法的框架,并允许子类在不改变该算法结构的情况下重新定义算法中的某些步骤。这种模式提供了一种将算法的通用部分封装在一个模板方法中,而将具体步骤的实现延迟到子类中的方式。

模板方法模式的案例?

  1. RestTemplate:
            在 Spring 框架中,RestTemplate 是用来发送 REST 请求的模板工具类。它使用了模板方法模式,提供了一些通用的方法和工具,使得发送 REST 请求的过程更加简单和灵活。RestTemplate 中的 execute、getForObject、postForObject 等方法构成了模板方法,它们定义了 REST 请求的通用流程,而具体的 HTTP 请求的细节则由不同的实现类来实现。

  2. RedisTemplate:
            在 Spring Data Redis 中,RedisTemplate 用于执行对 Redis 的各种操作。它同样使用了模板方法模式,定义了一系列对 Redis 的操作方法,如 set、get、delete 等,这些方法构成了模板方法,而底层的 Redis 连接和具体的操作则由实现类来完成。

  3. MongoTemplate:
           在 Spring Data MongoDB 中,MongoTemplate 用于执行对 MongoDB 的操作。与前面两个类似,MongoTemplate 也采用了模板方法模式,定义了诸如 find、insert、update 等方法,这些方法构成了模板方法,具体的 MongoDB 操作则由实现类来完成。

项目中模板方法实战案例?

        模板方法一般是在设计框架时,将一些固定的方法封装在模板中,那我们就可以直接调用,比如 String response = restTemplate.postForObject(url, request, String.class),我们只需要传入相应的网址,请求信息,返回格式即可,那在项目中我们可以怎么使用它呢?

       假设我们正在设计一个自动化测试框架,其中有多个测试用例需要执行,每个测试用例包括初始化、执行测试、清理等步骤,但是其中执行测试的细节又不一样。这时候可以使用模板方法模式来设计测试用例的执行流程。

1、首先,定义一个模板抽象类TestTemplate作为测试处理的模板:

public abstract class TestTemplate {public final void runTest() {initialize();executeTest();cleanup();}protected void initialize() {System.out.println("---执行测试用例初始化---");System.out.println("---开启测试环境---");// 执行其他初始化操作,例如连接数据库、加载配置文件等}protected abstract void executeTest();protected void cleanup() {System.out.println("---开始回收资源---");// 执行测试用例结束后的清理工作,例如关闭数据库连接、释放资源等}}

2、写一个验证注册场景的测试类,重写excuteTest()方法,并完成注册场景需要测试的细节 

public class RegisterCaseTest extends TestTemplate {@Overrideprotected void executeTest() {for (int i = 0; i < 100; i++) {System.out.println("随机生成账号密码...");System.out.println("验证注册信息");System.out.println("注册成功的信息,账号:xxx, 密码:xxx");System.out.println("注册失败的信息,账号:xxx, 密码:xxx");}}}

 3、写一个验证登录场景的测试类,重写excuteTest()方法,并完成登录场景需要测试的细节 

public class LoginCaseTest extends TestTemplate{@Overrideprotected void executeTest() {System.out.println("验证token!");System.out.println("通过账号密码进行信息验证!");System.out.println("验证权限!");System.out.println("验证加密算法!");}}

4、因为runTest()方法已经封装好了所有的流程,所以最后直接调用模板类中的runTest()方法即可开启自动化测试。

public class Test {public static void main(String[] args) {// 运行注册信息测试工具new RegisterCaseTest().runTest();// 运行登陆信息测试工具new LoginCaseTest().runTest();}
}

总结

  1. 模板方法模式在项目中的应用是通过定义一个抽象类作为模板,将固定的流程封装在模板方法中,而其中的某些步骤可以由具体子类来实现。这样可以减少重复的代码,并提供一个统一的执行流程,使得开发者可以更方便地编写代码。
  2. 一般来说在设计某些框架时会使用,因为整体流程都一致,只有某些步骤需要重写方法,来完成具体细节的实现。如JDBCTemplate,RestTemplate,RedisTemplate,MogoTemplate都是这么干的。

ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面试宝典》 

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

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

相关文章

【Go】Go语言中的数组与切片

纵使微茫如烟 纵有万般思念 流光总将故人搁浅在断简残篇 不成眠 不等谁来证明 不必狂歌痛饮 唯盼重相见 我如倦鸟归林 &#x1f3b5; 流浪的蛙蛙《从别后》 摘要 Go语言提供了强大的数据结构来处理固定长度的序列和动态长度的序列&#xff0c;分别称为数…

Superset二次开发之 配置Docker

手动安装 安装必要的一些系统工具 在设置仓库之前,需先安裝所需的软件包。yum-utils提供了yum-config-manager,并且device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。 yum install -y yum-utils device-mapper-persistent-data lvm2 设置源仓库 使用阿里云…

爬虫工作量由小到大的思维转变---<第五十一章 Scrapy 深入理解Scrapy爬虫引擎(2)--引擎的工作流程>

前言: 继续上一篇:https://hsnd-91.blog.csdn.net/article/details/136943552 本章主要介绍Scrapy引擎的启动流程、请求处理的生命周期、如何处理下载的内容以及触发Item Pipeline的过程。还讨论了数据处理在爬虫解析函数和Item Pipeline中的作用&#xff0c;并介绍了引擎关闭…

2024年 前端JavaScript Web APIs 第五天 笔记

5.1-BOM和延迟函数setTimeout 5.2-事件循环eventloop 1-》 3 -》2 1-》 3 -》2 5.3-location对象 案例&#xff1a;5秒钟之后自动跳转页面 <body><a href"http://www.itcast.cn">支付成功<span>5</span>秒钟之后跳转到首页</a><sc…

数据库测试案例20240322-binlog_format为row binlog日志分析,主备数据不一致会导致复制出问题

1 测试概述 master-1&#xff0c;master-2表数据test如下&#xff1a; 9:26: [mytest]> select *From test; ---------- | id | name | ---------- | 10 | 123 | ---------- 1 row in set (0.00 sec) 2 在主库将数据删除导致数据不一致 09:26: [mytest]> set sql_…

git的实际应用场景

本文章的场景主要来源于实际工作&#xff0c;用于记载回看&#xff1b;持续更新&#xff0c;最后更新日期&#xff1a;2024-03-23软件&#xff1a;Git BASH、GitK、Git GUI三者配合使用 1、git reset < file > 作用&#xff1a;把文件从暂存区状态重置为工作区状态&…

对象操作篇

文章目录 9.1 dir()9.2 hash()9.3 help()9.4 id()9.5 type() 9.1 dir() dir() 是 Python 中的一个内置函数&#xff0c;用于返回一个对象的所有属性和方法的列表。当dir()不带参数调用时&#xff0c;它会返回当前作用域中的变量、方法和定义的类型列表。如果dir()带有一个参数…

从零开始学HCIA之网络自动化02

1、Python 是一种解释型&#xff08;即不需要编译环节&#xff09;的、面向对象&#xff08;即支持面向对象的风格或代码&#xff09;的、动态数据类型的高级程序设计语言。对于所谓的高级程序设计语言&#xff0c;你可以理解为“同声传译”的过程。 2、Python标准库很庞大&am…

Shut down, sleep, or hibernate your PC 关闭、睡眠或休眠

最近一段时间没有整服务器了~自己开始捉摸18年买的笔记本-x280&#xff0c;除了发现usb type c和thunderbolt 3接口的不一样外&#xff0c;也开始研究这个待机的功能了~找了官方文档&#xff0c;做个简易的翻译&#xff0c;给大家一起看看学习把。 官方文档URL&#xff1a; S…

Docker搭建LNMP环境实战(02):Win10下安装VMware

实战开始&#xff0c;先安装 VMware 虚拟机。话不多说&#xff0c;上手就干&#xff01; 1、基本环境检查 1.1、本机Bios是否支持虚拟化 进入&#xff1a;任务管理器- 性能&#xff0c;查看“虚拟化”是否启用&#xff0c;如果已启用&#xff0c;则满足要求&#xff0c;如果未…

【Swagger】接口文档生成

文章目录 一、前后端分离开发流程二、YApi导入接口文档三、Swagger3.1 介绍3.2 使用步骤3.2.1 导入 knife4j 的maven依赖3.2.2 在配置类中加入 knife4j 相关配置3.2.3 配置类中设置静态资源映射3.2.4 访问测试 3.3 常用注解3.4 全局参数设置 四、YApi 与 Swagger 一、前后端分离…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

一个单生产-多消费模式下无锁方案(ygluu/卢益贵)

一个单生产-多消费模式下无锁方案 ygluu/卢益贵 关键词&#xff1a;生产者-消费者模型、无锁队列、golang、RWMutex 本文介绍一个“单生产(低频)-多消费”模式下的无锁哈希类方案&#xff0c;这个方案的性能优于golang的RWMutex&#xff0c;因为它永远不会因为“写”而导致与…

i2c-tools基本用法

一. 前言 前面调试一个I2C设备&#xff0c;用到了i2c-tools&#xff0c;觉得是一个调试I2C不错的工具&#xff0c;本文对i2c-tools的基本用法做一些介绍。i2c-tools是一些控制2C接口工具的集合&#xff0c;其中包括i2cdetect&#xff0c;i2cdump&#xff0c;i2cget&#xff0c;…

亚稳态及其解决办法

异步电路 亚稳态 亚稳态亚稳态的产生原因什么是同步异步信号怎么消除亚稳态 亚稳态 在数字电路中&#xff0c;每一位数据不是1&#xff08;高电平&#xff09;就是0&#xff08;低电平&#xff09;。当然对于具体的电路来说&#xff0c;并非1&#xff08;高电平&#xff09;就是…

ECMAScript与JavaScript辨析:标准与实现之辨

ECMAScript与JavaScript辨析&#xff1a;标准与实现之辨 目录 ECMAScript与JavaScript辨析&#xff1a;标准与实现之辨 一、引言 二、ECMAScript&#xff1a;脚本编程语言的标准蓝图 三、JavaScript&#xff1a;基于ECMAScript的实现 四、ECMAScript与JavaScript的交互关系及…

Notepad++ 如何调整显示字面大小

在 Notepad 上&#xff0c;可以使用 ctrl 加上鼠标的左键来滚动来进行调整。 如何恢复默 可以使用 Ctrl 加数字键盘上的 / 键 来恢复默认设置。 当然也可以通过菜单栏上 view 菜单下的 Zoom 选项。 上面的界面中可以看到我们的在 Notepad 中使用的选项。 Notepad 如何调整显示…

redis 如何保证数据同步(数据变化时)

redis 如何保证数据同步&#xff08;数据变化时&#xff09; 思路 1.新增、删除和修改都先对数据库进行操作&#xff0c;这时数据库的数据将域缓存中数据不同。 2.数据库进行变动后&#xff0c;返回结果&#xff0c;根据返回的结果判断数据库操作是否成功。 3.如果数据库操…

C++和Python计算金融数学方程算法模型

要点 C代码蒙特卡罗模拟金融产品估值&#xff0c;开发C并行计算模拟库。 算法伴随微分计算图及C代码实现释义&#xff1a;C应用经典的复合模式构建有向无环图&#xff0c;遍历有向无环图节点C实现&#xff0c;C使用懒惰评估计算次序&#xff0c;遍历代码实现&#xff0c;C代码…

图论复习(最短路、最小生成树)

图论复习 拓扑排序 原题链接&#xff1a;AcWing 848. 有向图的拓扑序列 - AcWing 在建图时&#xff0c;记录每个节点的入度&#xff0c;首先把入度为0的点都存到队列里。 然后在搜索时&#xff0c;每搜到一个点&#xff0c;就把这个点的入度 -1 &#xff0c;当它的入度变为…