当前位置: 首页 > news >正文

设计模式杂谈-模板设计模式

在进入正题之前,先引入这样一个场景:

程序员A现在接到这样一个需求:这个需求有10个接口,这些接口都需要接收前端的传参,以及给前端返回业务状态信息。出于数据保密的要求,不管是前端传参还是最终参数返回都是经过加密的,整个流程如下图:

接下来我们看一下常规编码方式呈现的效果:A

 @PostMapping("/xxxx")public String methodA(@RequestBody String req){//1.参数解密decrypt();//2.业务操作businessHandler();//3.返回信息加密encrypt();String result=null;return result;}@PostMapping("/xxxx")public String methodB(@RequestBody String req){///1.参数解密decrypt();//2.业务操作businessHandler();//3.返回信息加密encrypt();String result=null;return result;}public void decrypt(){}public void businessHandler(){}public void encrypt(){}

A同学吭呲吭呲的敲代码,最终代码效果如上图:

这个代码虽然是完成了需求,但是存在以下几点需要完善的地方:

1.不同的方法中存在很多相似的代码,代码维护的工作量增加了。

2.代码量增多,后续人员进来维护,需要阅读的工作量增加。

以上,我们可以提取出关键点:流程代码存在多处相同逻辑,A同学是个有代码洁癖的程序员,因此在需求完成“摸鱼的时刻”就在思考如何对代码进行抽象,刚好最近也在学习设计模式,A同学就在思考这种情况可以使用哪种设计模式进行简化,突然,灵光一现,想到这个情况刚好符合前几天学习过的模板设计模式。

模板设计模式(Template Method Pattern)是一种行为型设计模式,定义算法骨架并允许子类重写特定步骤。通过将不变行为移至父类,避免代码重复,同时保留子类的灵活性。 

 说干,A同学马上对代码进行梳理,梳理结果如下:

1.每个接口的执行流程大致相同,都需要进行解密、业务处理、加密。

2.整个接口分为3个大流程,其中解密流程、加密流程的行为比较固定,同时加密、加密的行为是一致的,业务处理流程根据不同的接口会存在不同的行为。

 说干就干,根据接口执行流程的特点,A同学马上对代码进行了如下改造:

1.加密、解密流程比较固定,可以直接定义为私有的方法,子类不需要进行修改。

2.业务处理方法行为不固定,但是该步骤是在解密和加密流程中间并且整个执行流程固定,可以将方法进行抽象,同时规定方法的执行的流程,也不允许子类修改。

改造后的代码如下:

public abstract class AbstractStrategy {/*处理业务参数*/public abstract Object businessParamHandle(Object obj);/*参数解密*/public Object decrypt(Object object){return null;}/*执行流程*/public Object execute(Object object){//1.执行解密Object decryptResult=decrypt(object);//2.业务处理Object result=businessParamHandle(object);//3.参数加密return encrypt(object);}/*参数加密*/public Object encrypt(Object object){return null;}}

 

http://www.lqws.cn/news/120475.html

相关文章:

  • 一文了解 GPU 服务器及其在数据中心中的角色
  • 在本地查看服务器上的TensorBoard
  • 联通专线赋能,亿林网络裸金属服务器:中小企业 IT 架构升级优选方案
  • Promtail采集服务器本地日志存储到Loki
  • LeetCode 3370.仅含置位位的最小整数
  • 使用Virtual Serial Port Driver+com2tcp(tcp2com)进行两台电脑的串口通讯
  • AlphaFold3服务器安装与使用(非docker)(1)
  • 模拟搭建私网访问外网、外网访问服务器服务的实践操作
  • Orthanc:轻量级PACS服务器与DICOMweb支持的技术详解
  • Spring Framework 中 UriComponentsBuilder工具类
  • Educational Codeforces Round 179 (Rated for Div. 2)(A-E)
  • Python训练营打卡DAY44
  • DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎
  • 掌握 MotionLayout:交互动画开发
  • UniApp 全生命周期钩子详解
  • python版若依框架开发:python版若依部署
  • 【后端开发】goland分布式锁的几种实现方式(mysql,redis,etcd,zookeeper,mq,s3)
  • #Java篇:学习node后端之sql常用操作
  • 前端面试三之控制语句
  • Linux kill 暂停命令
  • vue3+elementplus表格表头加图标及文字提示
  • Starrocks中RoaringBitmap杂谈
  • Spring Boot MVC自动配置与Web应用开发详解
  • 低代码采购系统搭建:鲸采云+能源行业订单管理自动化案例
  • 国产三维CAD皇冠CAD在「金属压力容器制造」建模教程:蒸汽锅炉
  • setting up Activiti BPMN Workflow Engine with Spring Boot
  • 一起学Spring AI:核心概念
  • 沉金PCB电路板制造有哪些操作要点需要注意?
  • 中小制造企业转型:低成本国产工业软件替代方案实践
  • 力扣刷题Day 70:在排序数组中查找元素的第一个和最后一个位置(34)