写点什么

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

发布于: 2021 年 02 月 01 日
如何基于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();}

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

@Servicepublic 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);}

@Servicepublic 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 的总结性文章,希望对你也有帮助,共同成长。


发布于: 2021 年 02 月 01 日阅读数: 31
用户头像

还未添加个人签名 2017.12.28 加入

公众号:技术进阶之路,专注技术开发能力的进阶写作分享,欢迎关注,共同进步!

评论

发布
暂无评论
如何基于Spring Aware和InitializingBean接口实现策略模式