if else 应用乱象主要分为以下几点:
1.if else 过多
2.if else 嵌套过深
3.表达式过于复杂
会导致以下的问题:
1.可读性差
2.可扩展性差
从软件设计角度来看, 不符合单一职责原则, 也不符合开闭原则; 由于需求千变万化, 所以提高扩展性非常重要;
今天我将使用策略设计模式(基于spring)解决if-else乱象的问题。
可以看出,实现策略模式分为两个重要的步骤:
第一:传入选择某种具体策略的标识;
第二:将所有的策略单独封装
第三:根据传入的标识,选择具体策略
在spring中, 我们可以将所有的策略实现类交给spring来管理;
案例:政法平台解析数据包在不同的地区使用不同的解析模式: 云南-云南模式;四川-四川模式;江苏-江苏模式等。
第一步:定义立案策略接口
public interface ZfptStrategyService {
//政法平台模式(标识)
String getZfptms();
//具体的策略算法(业务处理): xml解析
String parse(String path);
}
第二步:编写实现类, 以江苏四川为例:
@Service
public class JszfStrategyService implements ZfptStrategyService{
private static final String zfptms = "jsms";
@Override
public String getZfptms() {
return zfptms;
}
@Override
public String parse(String path) {
//具体业务处理
System.out.println("江苏政法模式================");
return null;
}
}
@Service
public class SczfStrategyService implements ZfptStrategyService{
private static final String zfptms = "scms";
//这里指定与当前策略相匹配的标识;
@Override
public String getZfptms() {
return zfptms;
}
@Override
public String parse(String path) {
//具体业务处理
System.out.println("四川政法模式================");
return null;
}
}
第三步:编写策略工厂类,方法实现如下:
@Component
public class ZfptStrategyFactory implements InitializingBean {
//将之前所有的策略实现类注入;
@Autowired
List<ZfptStrategyService> zfptStrategyServices;
private static Map<String, ZfptStrategyService> zfptStrategyServiceMap = new HashMap<>();
//spring bean初始化时收集所有策略实现类的策略标识,组成策略标识->策略实现的映射
@Override
public void afterPropertiesSet() {
zfptStrategyServices.stream().forEach(zfptStrategyService -> {
zfptStrategyServiceMap.put(zfptStrategyService.getZfptms(), zfptStrategyService);
});
System.out.println("策略组装完成---------》" + zfptStrategyServiceMap);
}
public static ZfptStrategyService getZfptService(String zfptms){
return zfptStrategyServiceMap.get(zfptms);
}
}
这样就实现了映射关系。
最后根据政法平台模式,执行具体的策略。
ZfptStrategyFactory.getZfptService(zfptms).parse("");
总结:通过策略模式,以后我们再新增新的政法平台模式时,不再需要改以前的代码,只需要继承ZfptStrategyService即可,不仅增强了代码的可扩展性,而且代码简捷宜读。