如何基于Spring Aware和InitializingBean接口实现策略模式

在实际开发中常会用到策略模型,根据不同的场景选用不同的策略来处理业务,实现策略模式的方法有多种,今天介绍基于Spring Aware和InitializingBean接口来策略模式的实现方式,该实现方式比较简单优雅。本文的代码示例根据加减计算策略来做一个简单的实现demo。

在这里插入图片描述

一、策略模式实现思路
1.implements 实现ApplicationContextAware接口,通过该接口获取Spring容器, 再根据容器获取所有的实现策略, 并把策略组装到一个集合中。

2.implements实现InitializingBean接口,接口中定义的afterPropertiesSet()会在Spring初始化完成后触发,这样就可以在该方法实现中实施步骤1的操作。

3.根据策略名称在策略集合中找到匹配的策略,然后调用策略相关的计算接口即可

二、策略模式示例代码

public interface CalculationStrategy {
    /**
     * 计算服务
     */
    int calculation(int a, int b);
    /**
     * 获取计算类型
     * @return
     */
    String getCalculationType();
}


@Service
public class MultiStrategy implements CalculationStrategy {
    @Override
    public int calculation(int a, int b) {
        int result = a * b;
        return result;
    }
    @Override
    public String getCalculationType() {
        return "Multi";
    }
}


@Service
public class PlusStrategy implements CalculationStrategy {
    @Override
    public int calculation(int a, int b) {
        int sum = a + b;
        return sum;
    }
    @Override
    public String getCalculationType() {
        return "Plus";
    }
}

public interface CalculationStrategyService {
    /**
     * 计算服务
     */
    int cal(String strategyName, int a , int b);
}


@Service
public class CalculationStrategyServiceImpl implements CalculationStrategyService, ApplicationContextAware, InitializingBean {
    private List<CalculationStrategy> strategyList = new ArrayList<>();
    private ApplicationContext applicationContext;
    @Override
    public int cal(String strategyName, int a, int b) {
        CalculationStrategy strategy = this.getStrategy(strategyName);
        return strategy.calculation(a,b);
    }
    /**
     *
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        //获取所有CalculationStrategy接口实现类集合
        Collection<CalculationStrategy> strategyCollection = applicationContext.getBeansOfType(CalculationStrategy.class).values();
        strategyList.addAll(strategyCollection);
        System.out.println("加载策略集合:" + strategyList);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    /**
     * 策略获取
     * @param strategyName
     * @return
     */
    private CalculationStrategy getStrategy(String strategyName) {
        for (CalculationStrategy strategy : strategyList) {
            if (strategy.getCalculationType().equals(strategyName)) {
                return strategy;
            }
        }
        return null;
    }
}
测试代码如下

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MultiStrategy.class,PlusStrategy.class,CalculationStrategyServiceImpl.class})
public class CalculationStrategyServiceTest {
    @Autowired
    private CalculationStrategyService calculationStrategyService;
    @Test
    public void calTest() {
        int result = calculationStrategyService.cal("Plus",1,2);
        System.out.println("计算结果: " + result);
        Assert.assertEquals(result,3);
    }
}

测试结果如下
在这里插入图片描述

从示例代码中可以看出,基于Spring Aware和InitializingBean接口来实现策略模式还是比较简单的。Spring的很多特性和工具值得我们去学习研究,这对提高编程水平很有帮助。后续还会陆续写一些关于Spring的总结性文章,希望对你也有帮助,共同成长。

更多内容欢迎关注个人微信公众号,一起成长!
​​​​在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值