系列二十四、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.hqwc.cn/news/224642.html

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

相关文章

好用的样式动画库集合(css、js)

文章目录 前言一、Animate.css二、Anime.js三、CSShake四、Hover.css五、AniJS六、Animista七、Tachyons-animate八、Sequence.js九、Infinite十、OBNOXIOUS.CSS十一、MOTION UI十二、Keyframes.app十三、AnimXYZ十四、Whirl十五、Hamburgers十六、Vivify十七、Magic Animation…

C++标准模板库 STL 简介(standard template library)

在 C 语言中&#xff0c;很多东西都是由我们自己去实现的&#xff0c;例如自定义数组&#xff0c;线程文件操作&#xff0c;排序算法等等&#xff0c;有些复杂的东西实现不好很容易留下不易发现的 bug。而 C为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器&#xf…

网络工程师精华篇,50种网络故障及解决方法大集合

上午好&#xff0c;我的网工朋友。 做网络工程师&#xff0c;自然离不开网络&#xff0c;而日常工作中能搞多少大项目&#xff1f;最常见的其实还是网络故障的处理了。 怎么最高效地排查网络故障&#xff1f;怎么简单几招通网&#xff1f; 今天就从基础的入手&#xff0c;分…

QT QComBox实现模糊查询

一、概述 在Qt中&#xff0c;可以通过QComboBox和QLineEdit实现模糊查询的功能。模糊查询是指根据用户输入的文本&#xff0c;在下拉框的选项中进行模糊匹配&#xff0c;并动态地显示匹配的选项。 二、基础知识 1、QCompleter (1)QCompleter 是 Qt 框架中提供的一个用于自动…

巅峰对决 LlamaIndex 与 OpenAI API大比拼

我们进行了一项详尽的分析&#xff0c;比较了 OpenAI 助手 API 和 LlamaIndex 在 RAG 性能方面的差异。目的是使用Tonic Validate评估各种RAG系统&#xff0c;该系统是一个RAG评估和基准平台&#xff0c;同时使用开源工具tvalmetrics。本文中使用的所有代码和数据都可以在这里找…

GaussDB数据库SQL系列-触发器

目录 一、前言 二、触发器概念 三、GaussDB数据库中的触发器 1、语法格式 2、创建步骤 3、注意事项 4、附&#xff1a;表和视图上支持的触发器种类 四、GaussDB数据库中的示例 示例一、在GaussDB数据库中创建一个触发器&#xff0c;以便在插入新记录时自动将记录的创建…

Rocky Linux 9.3 为 PowerPC 64 位带回云和容器镜像

RHEL 克隆版 Rocky Linux 9.3 今天发布了&#xff0c;作为红帽企业 Linux 发行版 CentOS Stream 和 Red Hat Enterprise Linux 的免费替代版本&#xff0c;现在可供下载。 Rocky Linux 9.3 是在 Rocky Linux 9.2 发布 6 个月之后发布的&#xff0c;它带回了 PowerPC 64 位 Lit…

Vatee万腾的数字创新征途:vatee科技力量的独特奇点

在数字化的时代浪潮中&#xff0c;Vatee万腾如一颗耀眼的明星&#xff0c;以其独特的科技奇点引领着数字创新的征途。无论是在人工智能、大数据、云计算&#xff0c;还是智能化领域&#xff0c;Vatee万腾都展现出了与众不同的创新力量&#xff0c;为科技征途描绘了独一无二的奇…

【开源】基于Vue+SpringBoot的学校热点新闻推送系统

项目编号&#xff1a; S 047 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S047&#xff0c;文末获取源码。} 项目编号&#xff1a;S047&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新…

[ CSS ] 内容超出容器后 以...省略

内容超出容器后 以…省略 当前效果 代码 <template><div class"box">有志者&#xff0c;事竟成&#xff0c;破釜沉舟&#xff0c;百二秦关终属楚; 有心人&#xff0c;天不负&#xff0c;卧薪尝胆&#xff0c;三千越甲可吞吴</div> </templa…

Linux - 动静态库(下篇)

前言 在上篇博客当中&#xff0c;对静态库是什么&#xff0c;怎么使用&#xff0c;简单实现自己的静态库&#xff0c;这些做了描述&#xff0c;具体请看上篇博客&#xff1a; 本篇博客将会对 动态库是什么&#xff0c;怎么使用&#xff0c;简单实现自己的动态库&#xff0c…

Linux—进程状态、僵尸进程、孤独进程、优先级

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程状态二、僵尸进程、孤儿进程1、Z(zombie)-僵尸进程2、僵尸进程危害3、孤儿进程 三、进…