一、前言
对于我们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 {
@Override
public 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 {
@Override
public 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 {
@Override
public 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 {
@Resource
private 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());
}
}