问题
在平时的项目中有很多中场景会导致我们使用if else去判断,从而对满足相应的条件的数据做出不同的处理,但是if else出现太多后会导致可读性变差,可维护性变低,可扩展性也很难(主要需要修改原有的代码)
例如:
if("1".equals(wirtType)){
do something
}else if("2".equals(wirtType)){
do something
}
...
策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
本次使用的是Springboot项目,采用策略模式解决项目中过多的IF ELSE
代码
StrategyContext:主要利用Spring的发现机制,将所有的处理业务逻辑的类注入到Map中,方便使用的时候根据类型获取相应的处理逻辑,如果不是通过自动注入,需要手动将处理逻辑的类放入到Map中
/**
* @description:
*/
@Service
public class WritMakeStrategyContext {
@Autowired
private Map<String,WritMakeHandleStrategy> writMakeHandleStrategyMap = new ConcurrentHashMap<String,WritMakeHandleStrategy>();
/**
* 利用Spring的发现机制,将数据自动注入到这里
*/
public WritMakeStrategyContext(Map<String,WritMakeHandleStrategy> writMakeHandleStrategyMap){
this.writMakeHandleStrategyMap.clear();
writMakeHandleStrategyMap.forEach((k,v) -> this.writMakeHandleStrategyMap.put(k,v));
}
/**
* 执行业务
*/
public String handleWritMake(WritMakeDataVo writMakeDataVo){
Assert.notEmpty(writMakeDataVo.getWritType(),"文书类型不能为空");
WritMakeHandleStrategy writMakeHandleStrategy = this.writMakeHandleStrategyMap.get(writMakeDataVo.getWritType());
Assert.notNull(writMakeHandleStrategy,"未找到的文书类型");
return writMakeHandleStrategy.handleWritMake(writMakeDataVo);
}
}
StrategyIntefer:处理逻辑的接口
public interface WritMakeHandleStrategy {
/**
* description 处理文书数据
*/
String handleWritMake(WritMakeDataVo writMakeDataVo);
}
StrategyImpl:处理逻辑实现类
/**
* @description: 处理1数据
*/
@Component("1")
public class Writ01HandleStrategy implements WritMakeHandleStrategy {
@Override
@Transactional(rollbackFor = Exception.class)
public String handleWritMake(WritMakeDataVo writMakeDataVo) {
return "01";
}
}
/**
* @description: 处理2数据
*/
@Component("2")
public class Writ01HandleStrategy implements WritMakeHandleStrategy {
@Override
@Transactional(rollbackFor = Exception.class)
public String handleWritMake(WritMakeDataVo writMakeDataVo) {
return "02";
}
}
...
结束,就是这么简单,这样的方式就算有新的类型也不影响现有的数据,当然如果类型确定的就那么两三个也不必要用这种方式 。