一、前言
对于我们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());}}