系列二十四、Spring设计模式之策略模式

一、前言

        对于我们Java开发人员来说,Spring框架的重要性不言而喻,可以说Java领域之所以发展这么壮大,生态这么丰富,功能这么强大,是离不开Spring以及由其衍生出来的各种子模块的,正是由它们共同奠定了JavaEE的基石!说起Spring,不得不说一下里面运用的非常丰富的设计模式,日常工作或者笔试面试中,必不可少的会用到或者被问到Spring设计模式相关的问题,查询网上资料,关于Spring设计模式相关的文章也鳞次栉比,好的有差的也有,代码断断续续的更是多数,看的人眼花缭乱,云里雾里!基于此,我决定结合自己工作中的实践,以及网上的资料,详细的写一篇关于Spring设计模式相关的案例,保证大家伙能够在轻松愉悦中,一窥Spring设计模式的奥妙!算是自己对Spring设计模式的一个总结吧,也为广大想系统学习Spring设计模式的朋友们提供一个参考,助力工作,顺利面试!,如果帮助到了你,请点赞 + 收藏 +关注 + 评论!

        说明:为了方便开发以下系列代码案例以Springboot脚手架进行演示

二、策略模式

2.1、概述

        策略模式是一种行为型设计模式,它定义了一些列算法,并将它们封装起来,使它们可以相互替换,而不影响客户端的使用。策略模式主要涉及到三个角色,即:环境类(Context)、抽象策略类(Strategy)、具体策略类(ConcreteStrategy),运行流程是:环境类持有一个策略对象的引用,可以根据不同的情况选择不同的策略执行业务逻辑,出现策略类定义了一个公共的接口,用于封装不同的算法,具体策略类实现了抽象策略类中的接口,并提供具体的算法实现。

2.2、案例代码

2.2.1、项目概览

2.2.2、pom

<dependencies><!-- spring-boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!-- 工具 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency><dependency><groupId>com.alibaba.citrus</groupId><artifactId>citrus-springext-all</artifactId><version>3.2.4</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version></dependency>
</dependencies>

2.2.3、PayStrategy

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/28 7:47* @Description: 抽象策略类*/
public interface PayStrategy {/*** 支付* @param amount* @return*/String pay(double amount);}

2.2.4、AlipayStrategy

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/28 7:48* @Description:*/
@Component("alipay")
public class AlipayStrategy implements PayStrategy {@Overridepublic String pay(double amount) {return "使用支付宝支付了【" + amount + "】元";}
}

2.2.5、WeChatPayStrategy

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/28 7:48* @Description:*/
@Component("wechatPay")
public class WeChatPayStrategy implements PayStrategy {@Overridepublic String pay(double amount) {return "使用微信支付了【" + amount + "】元";}
}

2.2.6、IcbcPayStrategy

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/28 7:48* @Description:*/
@Component("iCBCPay")
public class IcbcPayStrategy implements PayStrategy {@Overridepublic String pay(double amount) {return "使用工商银行支付了【" + amount + "】元";}
}

2.2.7、PayService

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/28 7:53* @Description:*/
@Getter
@Setter
@Service
public class PayService {private PayStrategy payStrategy;public String pay(double amount) {return payStrategy.pay(amount);}}

2.2.8、PayController

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/28 7:44* @Description:*/
@Slf4j
@RestController
public class PayController {@Resourceprivate PayService payService;@PostMapping("/pay")public String pay(@RequestBody PayParam param) {log.info("PayController pay param:{}", JSON.toJSONString(param));payService.setPayStrategy(SpringUtil.getBean(param.getPayType()));return payService.pay(param.getAmount());}}

 2.2.9、测试

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

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

相关文章

ECShop 4.x collection_listSQL注入

漏洞描述 ECShop是一款B2C独立网店系统&#xff0c;适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序 影响版本&#xff1a;ecshop4.0.7及以下 漏洞环境及利用 docker环境搭建 访问8080端口&#xff0c;数据库主机为mysql&a…

如何确定先做哪件事情。

问题描述&#xff1a;工作或者生活中&#xff0c;有许多件事情&#xff0c;我们应该先做那件事情。 解决办法&#xff1a;重要紧急的四象限法则。具体如下所示&#xff1a; -----------------------------------------------------------------------------------------------…

基于OGG实现MySQL实时同步

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

海外ASO优化之如何优化应用程序预览

应用程序预览是演示应用的特性、功能的界面。通过简短视频吸引用户应用商店。由于应用程序预览自动播放&#xff0c;所以它们是帮助用户发现和了解我们应用的关键。 1、规划应用程序预览。 应用商店支持的多种语言&#xff0c;最多可以有三个应用预览&#xff0c;每个预览的时…

接口测试:Jmeter和Postman测试方法对比

前阶段做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人…

【C/PTA —— 12.指针1(课内实践)】

C/PTA —— 12.指针1&#xff08;课内实践&#xff09; 6-1 交换两个整数的值6-2 利用指针找最大值6-3 字符串的连接6-4 移动字母 6-1 交换两个整数的值 void fun(int* a, int* b) {int* tmp *a;*a *b;*b tmp; }6-2 利用指针找最大值 void findmax(int* px, int* py, int* p…

超声波雪深监测站冬季雪景的智能守护者

随着冬季的到来&#xff0c;白雪皑皑的景象让人感到无比美丽。然而&#xff0c;雪景的美丽却给人们的生活和出行带来了一定的困扰。雪的深度和分布是影响道路交通、公共安全和旅游体验的关键因素。为了解决这一问题&#xff0c;WX-XS1 超声波雪深监测站在冬季应运而生&#xff…

DjiTello + YoloV5的无人机的抽烟检测

一、效果展示 注&#xff1a;此项目纯作者自己原创&#xff0c;创作不易&#xff0c;不经同意不给予搬运权限&#xff0c;转发前请联系我&#xff0c;源码较大需要者评论获取&#xff0c;谢谢配合&#xff01; 1、未启动飞行模型无人机的目标检测。 DjiTello YOLOV5抽烟检测 …

【自然语言处理】利用sklearn库函数绘制三维瑞士卷

一&#xff0c;原理介绍 sklearn.datasets.make_swiss_roll&#xff08;&#xff09;函数提供了三维瑞士卷的数据集&#xff0c;我们可以利用他来生成瑞士卷&#xff0c;该函数的用法见sklearn官方文档&#xff1a;官网文档&#xff1a;sklearn.datasets.make_swiss_roll&…

语音机器人的两种常见业务场景

第一个业务场景 之前写过一篇语音机器人是真人录音好&#xff0c;还是TTS转语音更好的文章。今天再来说一说TTS一个很细微的场景。 假设一句话 这里是*****银行委托机构&#xff0c;您在*****银行的信用卡长期逾期至今仍未依照约定履行还款义务&#xff0c;为避免逃废债给您…

【bmp文件怎么批量改成JPG?】

操作 在需要修改格式的图片文件夹中新建一个TXT文本文档 文档中输入(ren *.原图片类型 *.需要修改成的图片类型) ren *.bmp *.jpg 输入完成后保存 将刚刚新建的文档重命名 修改为.bat后缀的文件 弹出弹窗&#xff0c;点击是 双击此程序&#xff0c;即可将文件夹中的BMP图…

RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

将用户的session改为分布式共享session

将用户的session改为分布式session 分布式session理解 使用分布式session的原因&#xff1a; 后台服务器是分布式的&#xff08;比如要负载均衡&#xff09;&#xff0c;在A服务器请求的的信息&#xff08;如用户登录信息&#xff09;存在A的session中&#xff0c;B服务器并不…

百度手机浏览器关键词排名优化——提升关键词排名 开源百度小程序源码系统 附带完整的搭建教程

百度作为国内领先的搜索引擎&#xff0c;一直致力于为用户提供最优质的信息服务。在移动互联网时代&#xff0c;手机浏览器成为了用户获取信息的主要渠道。而小程序作为轻量级的应用程序&#xff0c;具有即用即走、无需下载等优势&#xff0c;越来越受到用户的青睐。然而&#…

Sass 语法详细介绍

文章目录 前言SASS缩进语法SASS的语法差异多线选择器注释import Mixin指令已弃用的语法后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正…

R语言期末考试复习二

上篇文章的后续&#xff01;&#xff01;&#xff01;&#xff01; http://t.csdnimg.cn/sqvYD 1.给向量vec1设置名为"A","B","C","D","E","F","G"。 2.将矩阵mat1的行名设置为"Row1"&#…

【OpenCV】图像上绘制文字cv2.putText()函数用法,添加倾斜透明水印

图像上绘制文字 1. 概述2. cv2.putText()函数参数3. 图像上绘制非中文文字4. 图像上绘制中文文字5. 图片上添加倾斜透明文字水印 1. 概述 在OpenCV中&#xff0c;调用cv2.putText()函数可添加文字到指定位置&#xff0c;对于需要在图片中加入文字的场景提供了一种比较直接方便的…

nodejs+vue+elementui足球篮球联赛系统

系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统&#xff0c;管理员可以对个人中心、用户管理、赛事信息管理、球队信息管理、球员信息管理、比赛分值板管理、系统管理等进行添加、查询、修改、删除&#xff0c;以保障足球联赛管理系统的正常运行。…

spring Cloud在代码中如何应用,erueka 客户端配置 和 服务端配置,Feign 和 Hystrix做高可用配置

文章目录 Eureka一、erueka 客户端配置二、eureka 服务端配置 三、高可用配置FeignHystrix 通过这篇文章来看看spring Cloud在代码中的具体应用&#xff0c;以及配置和注解&#xff1b; Eureka 一、erueka 客户端配置 1、Eureka 启禁用 eureka.client.enabledtrue 2、Eurek…