设计模式之模版方法实践

模版方法实践案例

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

定义

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

在什么情况下要使用模版方法呢?设计模式不能生搬硬套,而是在一些适合的场景下进行使用,否则会适得其反,可以看看这篇文章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.hqwc.cn/news/518163.html

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

相关文章

Batch Nomalization 迁移学习

Batch Nomalization 1.Batch Nomalization原理 图像预处理过程中通常会对图像进行标准化处理&#xff0c;这样能够加速网络的收敛。就是按照channel去求均值和方差&#xff0c;然后原数据减均值除标准差&#xff0c;使我们的feature map满足均值为0&#xff0c;方差为1的分布…

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

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

C#知识点-21(初识数据库)

数据库与内存、文件的比较 内存&#xff1a; 优点&#xff1a;存取速度快 缺点&#xff1a;-容量小 -断电后&#xff0c;数据不会保存 文件&#xff1a; 优点&#xff1a;数据可以持久化保存 缺点&#xff1a;-读取速度慢…

3款让人难以置信的软件,纯国产,真实用

闲话休提&#xff0c;直上狠货。 1、知犀思维导图 知犀思维导图是一款国产的优质思维导图工具&#xff0c;它能够帮助你捕捉每一个灵感瞬间&#xff0c;界面简洁易用&#xff0c;支持多人协作编辑&#xff0c;无论是理清思路、记录灵感、制定计划还是做笔记&#xff0c;都能轻…

Linux中线程的实现,线程的接口相关函数pthread_create、pthread_join、pthread_exit

目录 一.线程的概念 二.操作系统中线程的实现 三.Linux中线程的实现 四.进程与线程的区别 五.线程的接口相关函数 5.1 pthread_create 5.2 pthread_join 5.3 pthread_exit 六.代码演示 七.如何解决上述问题&#xff1f; 方案1. 方案2. 方案3. 一.线程的概念 进程是…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本&#xff0c;以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

数据结构——lesson6二叉树基础

前言 hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于数据结构顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感…

优思学院|使用完全数据计算CPK需要分子组吗?

使用全部数据进行计算&#xff0c;那么这种计算更类似于评估过程的PPK&#xff0c;PPK与计算CPK是不一样的&#xff0c;因为当数据以子组形式收集时&#xff0c;可以很容易地根据每个子组的范围或子组标准差来计算各个子组内的变异性。这是因为每个子组包含多个数据点&#xff…

你所需要的是 Wide Events,而不是 “Metrics、Logs 和 Traces”

原文[0] &#xff1a;Ivan Burmistrov - 2024.02.15 这段引自 Charity Majors 的话&#xff0c;或许是对当前科技行业可观测性状况的最佳概括——一个全面的、大规模的混乱。每个人都感到困惑&#xff0c;什么是 trace&#xff1f;什么是 span&#xff1f;一条 log 是 span 吗…

【C++庖丁解牛】模版初阶

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 泛型编程2. 函数模…

Python Module level import not at top of file (E402)

Python Module level import not at top of file 引言正文 引言 这里给大家简单介绍一下当我们使用 Pycharm 编译器时遇到的 Python Module level import not at top of file 提醒。 正文 请看下图&#xff1a; 这时就会提示我们这个信息&#xff0c;并且 import 下面会出…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第3章 开发板直连电脑配置方法(不能上外网)

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…