SpringBoot中使用策略模式 解决 if-else 问题
在某些场景中需要进行频繁的if-else 判断,会显的代码特别冗余,而且多重的if-else维护起来也很不容易,因此采用策略模式解决。
(以购买商品为例,普通会员原价购买,超级会员8折,下文为在springboot中通过策略模式的实现方法)
1.定义一个策略类接口,定义公共方法
/**
* @Author: daiguojun
* @CreateDate: 2021/4/12 17:52
* @Description: 策略模式接口定义
* (以购买商品为例,普通会员原价购买,超级会员8折)
*/
@Component
public interface TestStrategy {
//输入商品价格,返回需要支付价格
Integer getPrice(Integer price);
}
2.定义实现类
/**
* @Author: daiguojun
* @CreateDate: 2021/4/12 17:57
* @Description: 普通会员
* 以注解的形式将实现类对象注入到spring容器中
*/
@Component
public class OrdinaryMember implements TestStrategy {
@Override
public double getPrice(double price) {
return price;
}
}
/**
* @Author: daiguojun
* @CreateDate: 2021/4/12 17:58
* @Description: 超级会员
*/
@Component
public class SuperMember implements TestStrategy {
@Override
public double getPrice(double price) {
return price*0.8;
}
}
3.通过注解的形式将类名注入到map中
(接口的实现类需要加注解,否则无法将接口实现类对象注入到map集合中)
/**
* @Author: daiguojun
* @CreateDate: 2021/4/12 18:03
* @Description: 将实现类对象注入到map集合中
*/
@Component
@Slf4j
public class StrategyInfo {
private final Map<String, TestStrategy> map = new HashMap<>();
/**
* 将接口的实现类注入到map中,key为类名(首字母小写),value为实现类对象
* @param map
*/
@Autowired
public void setStrategyMap(Map<String, TestStrategy> map) {
this.map.clear();
map.forEach(this.map::put);
}
/**
* 通过该方法获取实现类
* @param mode
* @return
*/
public TestStrategy getObjectInfo(String str) {
if(str.isEmpty()){
log.info("输入字符串为空!");
return null;
}
return this.map.get(str);
}
}
4.测试
策略模式的实现
/**
* @Author: daiguojun
* @CreateDate: 2021/4/12 18:16
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class test {
@Autowired
private StrategyInfo strategyInfo;
@Test
public void test(){
Double price = 100.0;
TestStrategy ordinaryMember = strategyInfo.getObjectInfo("ordinaryMember");
System.out.println("普通会员售价:"+ordinaryMember.getPrice(price));
TestStrategy superMember = strategyInfo.getObjectInfo("superMember");
System.out.println("超级会员售价:"+superMember.getPrice(price));
}
}
5.总结
传递参数不同,调用接口的实现类不同,进而执行不同的操作。解决了频繁进行if-else 判断的问题,有效的提高代码质量。