【SpringBoot】模板设计模式应用

一、前言

常见的设计模式有23种,我们不得不提到模板方法设计模式,这是一种在软件开发中广泛使用的行为型设计模式之一。

二、模板方式是什么

全称是模板方法设计模式。

模板模式是一种行为设计模式。它的实现思路是,创建一个 模板方法 method,在该模板类中定义一些基本方法供模板方法 method 调用,这些基本方法通常是 protected 修饰的,因为它并不需要对外提供访问。模板方法 method 定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这些实现概括一部分子类或者全部子类的共同部分(说白了就是概括了所有子类的共同特性,并且自己实现了它)。

看到上面的 UML 图,理清下思路:一个最基本的模板方法模式中,你需要创建一个抽象类一个具体的实现类,从上图可以看到在抽象类中持有一个模板方法一些基本方法,而子类只需要对这些基本方法进行实现即可,子类并不需要对模板方法进行实现,因为抽象类已经实现好了。 

白话讲就是:创建一个抽象类并在里面定义一些方法,有的抽象类本身已经实现,实现方法的复用,有的需要子类去实现提高拓展性。 

三、模板方法的原理

模板方法的原理可以简单概括如下:

  • 定义算法骨架:在抽象基类中定义一个模板方法,该方法包含了算法的整体流程,通常由一系列步骤组成。这些步骤可以是抽象方法、具体方法或空方法(钩子方法)。
  • 子类定制实现:子类继承基类,并实现其中的抽象方法,以提供算法的具体实现。子类可以根据需要定制算法的某些步骤,而不必修改整个算法的结构。
  • 模板方法的调用:在客户端代码中,通过调用抽象基类的模板方法来启动算法。模板方法按照定义的流程调用了各个步骤,以及可能的具体方法或钩子方法。

总之,通过这种方式,模板方法设计模式实现了方法的复用,可以更好去拓展,同时将算法的整体结构清晰的展现在一个方法中,使得代码易于理解和维护。

四、项目实战

假设提供一种造房子的算法。算法的步骤就是模拟造房子的过程:建地基、建支撑,最后添加墙和窗户。

最重要的一点就是不能改变此建造过程(也就是我们不能修改或者重写模板方法的意思),比如不可能在没用地基的时候就开始建造窗户吧!如果可以,那简直是胡扯!这个例子中,我们就创建了一个模板方法,将使用不同的方法完成对房子的建造。

1、HouseTemplate 模板类

为了确保子类不能重写(override)这个模板方法,应当使用 final。

HouseTemplate(这个类对应上面 UML 图的 AbstractClass)

public abstract class HouseTemplate {// 这是我们的模板方法,子类不能重写public final void buildHouse() {// 第一步:建造地基buildFoundation();// 第二步:建造支撑buildPillars();// 第三步:建造墙buildWalls();// 第四步:建造窗户buildWindows();System.out.println("房子建造好了");}protected void buildFoundation() {System.out.println("建筑基础用水泥、铁棒和沙子");}// 被子类实现的方法protected abstract void buildPillars();protected abstract void buildWalls();// 这个步骤可以默认实现,原文是 private 修饰,那么就是我规定死啦,这个步骤只能这样实现了。// 但为了易拓展,还是 protected 好点protected void buildWindows() {System.out.println("建造玻璃窗");}}

2、WoodenHouse 实现类

public class WoodenHouse extends HouseTemplate {/*** 建造支撑*/@Overrideprotected void buildPillars() {System.out.println("建造木质涂料建筑支撑");}/*** 建造墙*/@Overrideprotected void buildWalls() {System.out.println("建造木墙");}
}

3、GlassHouse 实现类

public class GlassHouse extends HouseTemplate {/*** 建造支撑*/@Overrideprotected void buildPillars() {System.out.println("建造带有玻璃涂层的建筑支撑");}/*** 建造墙*/@Overrideprotected void buildWalls() {System.out.println("建筑玻璃墙");}}

4、Controller 层,使用模板方法

    @PostMapping("/test")public String test() {// 创建一个模板,子类由 WoodenHouse 实现HouseTemplate houseTemplate = new WoodenHouse();// 调用模板方法houseTemplate.buildHouse();System.out.println("-------------------分隔符------------------");// 创建一个模板,子类由 GlassHouse 实现houseTemplate = new GlassHouse();// 调用模板方法houseTemplate.buildHouse();return "success!";}

5、调用接口  localhost:8080/house/test

建筑基础用水泥、铁棒和沙子
建造木质涂料建筑支撑
建造木墙
建造玻璃窗
房子建造好了
-------------------分隔符------------------
建筑基础用水泥、铁棒和沙子
建造带有玻璃涂层的建筑支撑
建筑玻璃墙
建造玻璃窗
房子建造好了

五、模板方法设计模式的特点

  • 模板方法不能被子类重写,可用 final 修饰。
  • 一个模板方法有确定的步骤组成,这些步骤可以被不同的子类实现,也可以自己实现。

六、模板方法设计模式应用场景

  • 对于一个业务方法步骤固定,但这些步骤可以有不同的实现情况下

七、参考文档

谈一谈我对‘模板方法’设计模式的理解(Template)

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

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

相关文章

【C语言】static关键字的使用

目录 一、静态本地变量 1.1 静态本地变量的定义 1.2 静态本地变量和非静态本地变量的区别 二、静态函数 2.1 静态函数的定义 2.2 静态函数与非静态函数的区别 三、静态全局变量 3.1 静态全局变量的定义 3.2 静态全局变量和非静态全局变量的区别 四、静态结构体变量 …

机器学习6-逻辑回归

逻辑回归是机器学习中一种常用于二分类问题的监督学习算法。虽然名字中包含“回归”,但实际上它用于分类任务,特别是对于输出为两个类别的情况。逻辑回归通过使用 logistic 函数将输入映射到一个在0,1范围内的概率值,然后根据这个概率值进行分类。 以下是逻辑回归的基本概念…

Kafka系列(一)【消息队列、Kafka的基本概念、Kafka的工作机制、Kafka可满足的需求、Kafka的特性、Kafka的应用场景】

kafka系列 一 一、消息队列1. 消息队列的来源2. 什么是消息队列3. 消息队列主要有哪些作用 二、Kafka的基本概念代理、生产者、消费者、消费者组主题、分区、副本、记录 三、了解 Kafka的工作机制-生产消息/消费消息四、Kafka可满足的需求五、Kafka的特性六、Kafka的场景 转自《…

[MFC] MFC消息机制的补充

之前写了[MFC] 消息映射机制的使用和原理浅析,还有些需要补充的,都记在这里。 MFC 消息的分类 MFC消息分为系统消息和自定义消息。 图片来源:C语言/C教程 大型源码案例分析:MFC消息系统的代码解析 易道云编程 系统消息分为窗口…

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命 开源软件如何推动技术创新开源软件的开放性和协作精神促进知识共享和技术迭代推动关键技术的发展开源软件与新技术的融合 开源软件的商业模式开源软件的商业模式将开源软件与商业软件相结合 开源软件的安全风…

2023年哪个前端框架用的最多?

2023 年,TypeScript 的每月下载量持续稳定增长,年度累计下载量高达2,071,832,110(20.7 亿),展现了强大的市场需求和用户认可。 本文来通过详细的数据(2023 年 npm 累计下载量),看看…

idea中找到所有的TODO

idea中找到所有的TODO (1)快捷键 Alt6 (2)View -> Tool Windows -> TODO

LNMP.

一.mysl配置 1.安装mysql yum install mysql-server -y 2.进入mysql配置文件目录 cd /etc/my.cnf.d3.编辑mysql配置文件 vim mysql-server.cnf 在[mysqld]中添加: character-set-serverutf84.启动mysql服务 systemctl start mysqld5.登入mysql mysql 6.创建数据库 cre…

2023年09月CCF-GESP编程能力等级认证Python编程五级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话。 HTTP协议是无状态的,导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

新产品!可视化试卷搭建平台

hi, 大家好, 我是徐小夕. 之前和大家分享了很多可视化低代码和零代码的技术实现和产品设计思路, 也和大家分享了 H5-Dooring 零代码搭建平台的技术实现和未来规划, 今天继续和大家分享一下我们的新产品——橙子试卷. 橙子试卷 是一款可视化试卷/问卷搭建平台, 我们可以通过拖拽…

HttpRunner自动化测试之实现参数化传递

参数化实现及重复执行 参数化测试:在接口测试中,为了实现不同组数据对同一个功能模块进行测试,需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化: 1、在YAML/JSON 中直接指定参数列表 2、…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-应用弹窗(十一)

一、应用弹窗 1、概述 在我们日常使用应用的时候,可能会进行一些敏感的操作,比如删除联系人,这时候我们给应用添加弹窗来提示用户是否需要执行该操作,如下图所示: 弹窗是一种模态窗口,通常用来展示用户…

树状数组复习

基本原理 树状数组的原理简单来说就是利用二进制拆分区间 我们可以对一个数进行二进制分解,最多分解成log(x)个数,同样我们可以对[1,n]这个区间进行分解。也是最多log段,每次修改时我们维护受到影响的区间,然后查询时用这log个区…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉

专属领域论文订阅 关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起…

论文阅读:Learning Lens Blur Fields

这篇文章是对镜头模糊场进行表征学习的研究,镜头的模糊场也就是镜头的 PSF 分布,镜头的 PSF 与物距,焦距,光学系统本身的像差都有关系,实际的 PSF 分布是非常复杂而且数量也很多,这篇文章提出用一个神经网络…

数仓建模维度建模理论知识

0. 思维导图 第 1 章 数据仓库概述 1.1 数据仓库概述 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据,借助数据仓库的分析能力,企业可从数据中获得宝贵的信息进而改进决策。同时,随着时间的…

算法42:天际线问题(力扣218题)---线段树

218. 天际线问题 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] [lefti, righti, heig…

【学网攻】 第(20)节 -- 网络端口地址转换NAPT配置

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

C语言应用实例——贪吃蛇

(图片由AI生成) 0.贪吃蛇游戏背景 贪吃蛇游戏,最早可以追溯到1976年的“Blockade”游戏,是电子游戏历史上的一个经典。在这款游戏中,玩家操作一个不断增长的蛇,目标是吃掉出现在屏幕上的食物&#xff0c…