设计模式之模版方法实践

模版方法实践案例

实践之前还是先了解一下模版方法的定义

定义

模板方法模式是一种行为设计模式,它定义了一个骨架,并允许子类在不改变结构的情况下重写的特定步骤。模板方法模式通过在父类中定义一个模板方法,其中包含了主要步骤,而将一些步骤的实现留给子类。这样,子类可以在不改变算法整体结构的情况下,根据需要重新实现某些步骤。

在什么情况下要使用模版方法呢?设计模式不能生搬硬套,而是在一些适合的场景下进行使用,否则会适得其反,可以看看这篇文章http://www.ayqy.net/blog/设计模式总结(《head-first设计模式》学习总结)

进入正题

以下是我项目应用模版方法的代码片段

/*** @Author: HWQ* @Version: 1.0* @Description: 基本api请求*/
public abstract class BaseRequest<O, T extends ResultResponse> {private Map<String, Object> requestParams = new HashMap<>();/*** get方法** @return {@link}*/public abstract String getMethod();/*** 获取路径** @return {@link String}*/public abstract String getPath();/*** 获取响应类** @return {@link Class}<{@link T}>*/public abstract Class<T> getResponseClass();@JsonAnyGetterpublic Map<String, Object> getRequestParams() {return requestParams;}public void setRequestParams(O params) {// 将JSON对象转为Mapthis.requestParams = new Gson().fromJson(JSONUtil.toJsonStr(params), new TypeToken<Map<String, Object>>() {}.getType());}
}

BaseRequest定义了骨架,具体的步骤包括获取请求方法(getMethod)、获取路径(getPath)、获取响应类(getResponseClass)等。

/*** @author HWQ* @date 2024/2/28 11:54* @description*/@Accessors(chain = true)
public class ChatAIRequest extends BaseRequest<ChatAIParams, ResultResponse> {@Overridepublic String getPath() {return "/chatAi";}/*** 获取响应类** @return {@link Class}<{@link NameResponse}>*/@Overridepublic Class<ResultResponse> getResponseClass() {return ResultResponse.class;}@Overridepublic String getMethod() {return RequestMethodEnum.GET.getValue();}
}

ChatAIRequest继承了BaseRequest这个抽象类,实现了获取请求方法(getMethod)、获取路径(getPath)、获取响应类(getResponseClass)

分析一下

好处在哪?

  1. 提高代码一致性

如果我的系统中仅有ChatAIRequest这个类,那我大可不必采用模版方法

问题是我的项目中有大量的Request类,并且这个Request的骨架是相同的,所以这些Request类只需要继承BaseRequest这个抽象类,实现各自的获取请求方法(getMethod)、获取路径(getPath)、获取响应类(getResponseClass)即可

在这里插入图片描述

  1. 减少重复代码: 具体的请求类(例如 chatAiRequest)无需重复实现算法的整体结构,只需专注于实现特定的步骤,如获取请求方法、路径等。这降低了代码的冗余,符合"Don’t Repeat Yourself"(DRY)原则

  2. 提高代码的可维护性: 算法的整体结构集中在 BaseRequest 类中,使得代码更易理解和维护。如果有新的请求类需要添加,只需创建新的具体子类,并实现特定的步骤,而不需要修改已有的代码

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

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

相关文章

1、MQ_介绍、优缺点、类型等

MQ介绍 1. MQ概述 MQ&#xff08;Message Queue&#xff09;&#xff1a;消息队列&#xff0c;是基础数据结构中FIFO&#xff08;first in first out&#xff09;的一种数据结构。一般用来解决流量削峰、应用解耦、异步处理等问题&#xff0c;实现高性能&#xff0c;高可用&a…

Salesforce 2024财年爆发式增长!第一次现金分红

对于Salesforce来说&#xff0c;这是非凡的转型之年&#xff0c;所有的关键指标都表现强劲&#xff0c;现金流和利润增长创下了纪录。截至第四季度末&#xff0c;Salesforce的剩余履约价值&#xff08;RPO&#xff09;总额为569亿美元&#xff0c;同比增长17%。 Marc Benioff …

H5小游戏,斗地主

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的,私信本人,发演示地址,可以后再订阅,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、开心消消乐、扑鱼达人、飞机大战等等 <!DOCTYPE html> <html> <…

使用DockerFile构建Tomcat镜像

1、准备镜像文件tomcat压缩包&#xff0c;jdk的压缩包 tomcat链接&#xff1a;https://pan.baidu.com/s/1Xpecb-BSGR2sdxSL7FDtBw?pwd1234 提取码&#xff1a;1234 jdk链接&#xff1a;https://pan.baidu.com/s/1mQHInn27j1I9uuuicBsyAA?pwd1234 提取码&#xff1a;1234 …

vue3 + vite 项目可以使用纯Js开发吗?

答案&#xff1a;可以 创建项目&#xff1a; 按照链接参考或者按官方&#xff1a; webstorm 创建vue3 vite 项目-CSDN博客 项目目录 tsconfig.json 配置允许js allowJs指定是否编译js文件&#xff0c;在任意文件当中,如果我们模块使用js写的&#xff0c;那么我们需要 将all…

Spring——Bean的作用域

bean的作用域 Bean Scope Scope说明singleton&#xff08;默认情况下&#xff09;为每个Spring IoC容器将单个Bean定义的Scope扩大到单个对象实例。prototype将单个Bean定义的Scope扩大到任何数量的对象实例。session将单个Bean定义的Scope扩大到一个HTTP Session 的生命周期…

MySQl基础入门③

上一遍内容 接下来我们都使用navicat软件来操作数据了。 1.新建数据库 先创建我门自己的一个数据库 鼠标右键点击bendi那个绿色海豚的图标&#xff0c;然后选择新建数据库。 数据库名按自己喜好的填&#xff0c;不要写中文&#xff0c; 在 MySQL 8.0 中&#xff0c;最优的字…

【教程】HBuilderX开发实践:隐私合规检测问题解决方案

文章目录 摘要引言正文1、违规收集个人信息2、APP强制、频繁、过度索取权限 知识点补充总结 摘要 本篇博客介绍了在使用HBuilderX进行开发过程中&#xff0c;常遇到的隐私合规问题&#xff0c;并提供了相应的解决方案。主要包括违规收集个人信息和APP强制、频繁、过度索取权限…

[机器视觉]halcon十二 条码识别、字符识别之二维码识别

[机器视觉]halcon十二 条码识别、字符识别之二维码识别 流程 获取图像-》创建模型-》条码识别-》清除模型 注意 halcon默认是读白底黑字的二维码&#xff0c;如果你的码是黑底白字的要反一下。 算子 create_data_code_2d_model : 创建模型 set_data_code_2d_param :…

Tomcat介绍在IDEA中创建JavaWeb工程

文章目录 一、WEB服务器服务器概述使用Java代码手写web服务器 二、服务器软件Web服务器服务器软件的使用步骤 三、TomcatTomcat的下载Tomcat的安装与卸载Tomcat的启动与关闭常见问题 四、新建Java Web项目并将项目部署到tomcat中新建Java Web项目将项目部署到Tomcat中出现的问题…

【软考】单元测试

目录 1. 概念2. 测试内容2.1 说明2.2 模块接口2.3 局部数据结构2.4 重要的执行路径 3. 测试过程2.1 说明2.2 单元测试环境图2.3 驱动模块2.4 桩模块 4. 模块接口测试与局部数据结构测试的区别 1. 概念 1.单元测试也称为模块测试&#xff0c;在模块编写完成且无编译错误后就可以…

Day19:信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间

目录 各类红蓝队优秀工具项目集合 自动化-武器库部署-F8x 自动化-网络空间-AsamF 自动化-企查信息-ENScan 自动化-综合架构-ARL&Nemo 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应…

wps没保存关闭了怎么恢复数据?恢复文件教程

Microsoft Word是我们不可或缺的工具。很多小伙伴都遇到在WPS中编辑文件时&#xff0c;它可能会突然闪退&#xff0c;或者忘记及时保存文件就直接关闭了&#xff0c;导致我们辛苦编辑的文档丢失。面对这种情况我们该如何应对&#xff0c;尽量减小损失呢&#xff1f;接下来让我为…

【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据

一、前言 之前写过两篇PHP实现与硬件串口交互的文章&#xff0c;一篇是【PHP】PHP实现与硬件串口交互&#xff0c;接收硬件发送的实时数据&#xff08;上&#xff09;_php串口通信-CSDN博客&#xff0c;另一篇是【PHP】PHP实现与硬件串口交互&#xff0c;向硬件设备发送指令数…

【IEEE会议征稿通知】第九届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2024)

【IEEE会议】第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISCTT 2024&#xff09; 2024 9th International Conference on Information Science, Computer Technology and Transportation 第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISC…

【深度学习笔记】优化算法——随机梯度下降

随机梯度下降 在前面的章节中&#xff0c;我们一直在训练过程中使用随机梯度下降&#xff0c;但没有解释它为什么起作用。为了澄清这一点&#xff0c;我们刚在 :numref:sec_gd中描述了梯度下降的基本原则。本节继续更详细地说明随机梯度下降&#xff08;stochastic gradient d…

【项目】图书管理系统

目录 前言&#xff1a; 项目要求&#xff1a; 知识储备&#xff1a; 代码实现&#xff1a; Main&#xff1a; Books包&#xff1a; Book&#xff1a; BookList&#xff1a; Operate包&#xff1a; Operate: addOperate: deleteOperate: exitOperate: findOperate:…

java基础-mysql

文章目录 1&#xff1a;mysql基础面试题什么是mysql什么是事务并发事务带来的影响事物的隔离级别索引大表优化什么是池化思想&#xff0c;什么是数据库连接池&#xff0c;为什么要用数据库连接池⾏锁&#xff0c;表锁&#xff1b;乐观锁&#xff0c;悲观锁MySQL主备同步的基本原…

Intellij IDE 中复制多个服务

Intellij IDE 中复制多个服务 添加此选项 选择启动的端口和运行时的环境 之后就可以了。