1.背景:
在项目经常会遇到因为不同的条件执行不同的方法,当类型比较多的情况下,代码维护起来比较痛苦,并且会有大量的if-else判断。这样不管是后期的需求迭代还是别人接手代码,那都是相当的自闭。。。
2.反面教材:
首先我们先看下面一段代码,这边采用大量的状态if else 判定
if ("AType".equals(tier)) {
Map<String, Object> mapPar = new HashMap<String, Object>();
mapPar.put("tier", tier);
mapPar.put("tierStr", "");
mapPar.put("tierStrOther", "");
ApiResponse<List<Govdep>> govdepListApi = accountClient.getGovdepList(mapPar);
if (govdepListApi.getStatus() == 200) {
govdepList = govdepListApi.getBody();
}
return govdepList;
} else if ("AType".equals(tier)) {
Map<String, Object> mapPar = new HashMap<String, Object>();
mapPar.put("tier", "");
mapPar.put("tierStr", tier);
mapPar.put("tierStrOther", "");
ApiResponse<List<Govdep>> govdepListApi = accountClient.getGovdepList(mapPar);
if (govdepListApi.getStatus() == 200) {
govdepList = govdepListApi.getBody();
}
return govdepList;
} else {
Map<String, Object> mapPar = new HashMap<String, Object>();
mapPar.put("tier", "");
mapPar.put("tierStr", "");
mapPar.put("tierStrOther", tier);
ApiResponse<List<Govdep>> govdepListApi = accountClient.getGovdepList(mapPar);
if (govdepListApi.getStatus() == 200) {
govdepList = govdepListApi.getBody();
}
return govdepList;
}
3.优雅写法
-
策略枚举
public enum TypeEnum { A { @Override public Class acquireStrategy() { return ATypeStrategy.class; } }, B { @Override public Class acquireStrategy() { return BTypeStrategy.class; } }; public abstract Class<TypeStrategy> acquireStrategy(); }
-
抽象接口定义
/** * 抽象接口 */ public interface TypeStrategy { void execute(String requestParam); }
-
抽象接口实现
@Component public class ATypeStrategy implements TypeStrategy { @Override public void execute(String requestParam) { System.out.println("执行A策略的业务代码"); } }
@Component public class BTypeStrategy implements TypeStrategy { @Override public void execute(String requestParam) { System.out.println("执行B的业务代码"); } }
-
具体业务使用
/** * @title: BusinissessService * @description: 执行业务代码 * @date 2020/12/27 7:24 下午 */ @Service public class BusinessService implements ApplicationContextAware { private ApplicationContext applicationContext; public void business(String requestParam, String type) { // 策略选取执行 TypeStrategy typeStrategy = applicationContext.getBean(TypeEnum.valueOf(type).acquireStrategy()); // 执策略方法 typeStrategy.execute(requestParam); } //此处利用了Spring声明周期中的特性, Spring 自动注入 ApplicationContext @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }