0
点赞
收藏
分享

微信扫一扫

Spring framework Day11:策略模式中注入所有实现类

SPEIKE 2023-10-14 阅读 31

前言

什么是策略模式?

策略模式(Strategy Pattern)是一种面向对象设计模式,它定义了算法族(一组相似的算法),并且将每个算法都封装起来,使得它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。

在策略模式中,定义一个抽象的策略接口或者抽象类来封装不同的具体算法实现,并由客户端根据需要动态选择使用哪种算法。这种方式支持应用程序灵活地更换算法和扩展算法,而无需修改已有代码。此外,策略模式可以减少大量的 if-else 语句,提高代码的可读性和可维护性。

策略模式通常包含三个角色:

在使用策略模式时,首先定义一个抽象的策略接口或抽象类,然后定义具体的策略实现类,最后将策略实现类注入到需要使用的类中。这样可以让客户端通过改变具体的策略实现类,来灵活地选择不同的算法,从而实现目标。

 

一、开始学习

本次案例,通过支付的例子来完成一个案例。

1、新建项目,结构如下

2、添加 spring 依赖
 
    <!-- spring 的核心依赖 -->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>
 
    </dependencies>
 3、在 service 包下新建一个 Payment 接口,在 impl 包下新建 AliPayment、WeChartPayment实现类

Payment 接口

/**
 * @Date 2023-10-07
 * @Author qiu
 * 支付接口,对应有不同的实现
 */
public interface Payment {

    /**
     * 支付方法
     * @param money
     */
    void pay(BigDecimal money);

}

Alipayment 实现类

/**
 * @Date 2023-10-07
 * @Author qiu
 * 支付宝支付
 */
@Service
@Slf4j
public class AliPayment implements Payment {
    @Override
    public void pay(BigDecimal money) {
        log.info("使用支付宝支付金额: " + money.doubleValue());
    }
}

WeChartPayment 实现类

/**
 * @Date 2023-10-07
 * @Author qiu
 * 微信支付
 */
@Slf4j
@Service
public class WeChartPayment implements Payment {
    @Override
    public void pay(BigDecimal money) {
        log.info("使用微信支付金额:" + money.doubleValue());
    }
}

看下图分析:

4、如何使用 spring 注入所有的实现类呢?
1)新增一个 PaymentContext 类

@Service
/**
 * 利用 Lombok 生成一个带参数的构造方法
 * 这样即可以通过构造方法直接注入
 */
@RequiredArgsConstructor
public class PaymentContext {

    /**
     * 构造方法注入
     * 注入一个 map 集合,spring 会将 Payment 接口的所有实现类
     * 一并保存到 map 中
     * key(bean 的 id) 为支付类型, value 是具体的支付策略实现
     */
    private final Map<String, Payment> paymentMap;

    /**
     * 根据支付类型选择具体的策略来完成支付
     * @param paymentType 支付类型
     * @param money 支付金额
     */
    public void pay(String paymentType, BigDecimal money){
    Payment payment = paymentMap.get(paymentType);
    payment.pay(money);
    }

}
2)在 controller 包下新增一个 PaymentContorller 类

@Controller
@RequiredArgsConstructor
public class PaymentController {

    /**
     * 注入策略上下文
     */
    private final PaymentContext context;


    public void pay(String type, BigDecimal money) {
        context.pay(type, money);
    }

}
5、在 resources 下新建一个 spring 的 xml 文件 beans.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
 
    <!-- 启用包扫描 -->
    <context:component-scan base-package="edu.nf.ch09"/>
 
</beans>
6、测试
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        PaymentContext bean = context.getBean(PaymentContext.class);
        bean.pay("weChartPayment", new BigDecimal("100"));
    }

}

运行结果

 

二、使用策略模式注入所有实现类的好处 

使用策略模式注入所有实现类的好处主要有以下几个方面:

总之,使用策略模式注入所有实现类具有解耦性、可扩展性、可配置性和单一职责原则等优点,使得系统更加灵活、可维护和可测试。

三、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

举报

相关推荐

总结-day11

HTML入门DAY11

Linux学习-DAY11

java笔记Day11

Java学习-Day11

工具类中注入配置属性

Python学习打卡:day11

0 条评论