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