if(nameOfExcel == "A"){
//按照A方案或者逻辑进行处理
}else if(){
//按照B方案或者逻辑进行处理
}else{
//按照C方案或者逻辑进行处理
}
...
违背了面向对象编程的开闭原则以及单一原则
】:
如果分支变多,这里的代码就会变得臃肿,难以维护,可读性低
。如果你需要接入一种新的解析类型,那只能在原有代码上修改
每个条件分支,可以封装起来替换的
【或者switch…case…case…case…几十几百几千个case】,我们就可以使用策略模式来优化
。分别封装起来【将每一个算法封装到具有共同接口的独立的类中】,让它们之间可以相互替换
,此模式让 算法的变化独立于使用算法的的客户
,咱们中国最著名的策略模式的使用就是:在目的为把事办好的情况下:对症下药、量体裁衣、具体问题具体分析一个接口或者抽象类,里面两个方法(一个方法匹配类型,一个可替换的逻辑实现方法)
public interface DemoByHuFileStrategy{
//属于哪种文件解析类型
FileTypeResolveEnum gainFileType();
//封装的公用算法或者叫具体的解析算法
void resolve(Object objectparam);
}
很多个不同策略的实现类
,就可以愉快的玩耍了//按照A方案或者逻辑进行处理
@Component
public class AFileResolve implements DemoByHuFileStrategy{
@Override
public FileTypeResolveEnum gainFileType() {
return FileTypeResolveEnum.File_A_RESOLVE;
}
@Override
public void resolve(Object objectparam) {
logger.info("按照A方案或者逻辑进行处理解析文件,参数:{}",objectparam);
...
}
}
//按照B方案或者逻辑进行处理
@Component
public class BFileResolve implements DemoByHuFileStrategy{
@Override
public FileTypeResolveEnum gainFileType() {
return FileTypeResolveEnum.File_B_RESOLVE;
}
@Override
public void resolve(Object objectparam) {
logger.info("按照B方案或者逻辑进行处理解析文件,参数:{}",objectparam);
...
}
}
//按照C方案或者逻辑进行处理
@Component
public class CFileResolve implements DemoByHuFileStrategy{
@Override
public FileTypeResolveEnum gainFileType() {
return FileTypeResolveEnum.File_C_RESOLVE;
}
@Override
public void resolve(Object objectparam) {
logger.info("按照C方案或者逻辑进行处理解析文件,参数:{}",objectparam);
...
}
}
借助spring的生命周期,使用ApplicationContextAware接口,把对应的策略,初始化到map里面。然后对外提供resolveFile方法即可。
@Component
public class StrategyUseService implements ApplicationContextAware{
private Map<FileTypeResolveEnum, IFileStrategy> iFileStrategyMap = new ConcurrentHashMap<>();
public void resolveFile(FileTypeResolveEnum fileTypeResolveEnum, Object objectParam) {
IFileStrategy iFileStrategy = iFileStrategyMap.get(fileTypeResolveEnum);
if (iFileStrategy != null) {
iFileStrategy.resolve(objectParam);
}
}
//把不同策略放到map
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, IFileStrategy> tmepMap = applicationContext.getBeansOfType(IFileStrategy.class);
tmepMap.values().forEach(strategyService -> iFileStrategyMap.put(strategyService.gainFileType(), strategyService));
}
}
巨人的肩膀:
设计模式之禅
Head First 设计模式
spring揭秘
JavaGuide
“程序员田螺 - 设计模式”