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

一、前言

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

}

 2.2.9、测试

原文地址:https://blog.csdn.net/HelloWorld20161112/article/details/134657048

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_5121.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注