在实际开发中常会用到策略模型,根据不同的场景选用不同的策略来处理业务,实现策略模式的方法有多种,今天介绍基于 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 的总结性文章,希望对你也有帮助,共同成长。
评论