-
我想小伙伴们经常有这样的不满,我的业务逻辑就3 4 行,你给我整一大堆类定义?有必要这么麻烦吗?我看具体的业务逻辑还需要去不同的类中,简单点行不行。
-
其实我们所不满的就是策略模式带来的缺点:1、策略类会增多 2、业务逻辑分散到各个实现类中,而且没有一个地方可以俯视整个业务逻辑
-
针对传统策略模式的缺点,在这分享一个实现思路,这个思路已经帮我们团队解决了多个复杂if else的业务场景,理解上比较容易,代码上需要用到Java8的特性——利用Map与函数式接口来实现。
-
直接show代码结构:为了简单演示一个思路,代码用String 类型来模拟一个业务BO
其中:
- getCheckResult() 为传统的做法
- getCheckResultSuper()则事先在Map中定义好了“判断条件”与“业务逻辑”的映射关系,具体讲解请看代码注释
public interface IMapClueService {
/**
* 传统的 if else 解决方法
* 当每个业务逻辑有 很多 行时,用传统的策略模式不值得,直接的if else又显得不易读
*/
String getCheckResult(String order);
String getCheckResultSuper(String order);
}
@Service
public class MapClueServiceImpl implements IMapClueService {
/**
* 业务逻辑分派Map
* Function为函数式接口,下面代码中 Function<String, String> 的含义是接收一个Stirng类型的变量,返回一个String类型的结果
*/
private Map<String, Function<String, String>> checkResultDispatcher = new HashMap();
/**
* 传统的 if else 解决方法
* 当每个业务逻辑有 很多 行时,用传统的策略模式不值得,直接的if else又显得不易读
*/
@Override
public String getCheckResult(String order) {
if ("校验1".equals(order)) {
return "执行业务逻辑1";
} else if ("校验2".equals(order)) {
return "执行业务逻辑2";
} else if ("校验3".equals(order)) {
return "执行业务逻辑3";
} else if ("校验4".equals(order)) {
return "执行业务逻辑4";
} else if ("校验5".equals(order)) {
return "执行业务逻辑5";
} else if ("校验6".equals(order)) {
return "执行业务逻辑6";
} else if ("校验7".equals(order)) {
return "执行业务逻辑7";
} else if ("校验8".equals(order)) {
return "执行业务逻辑8";
} else if ("校验9".equals(order)) {
return "执行业务逻辑9";
}
return "不在处理的逻辑中返回业务错误";
}
/**
* 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
*/
@PostConstruct
public void checkResultDispatcherInit() {
checkResultDispatcher.put("校验1", order -> String.format("对%s执行业务逻辑1", order));
checkResultDispatcher.put("校验2", order -> String.format("对%s执行业务逻辑2", order));
checkResultDispatcher.put("校验3", order -> String.format("对%s执行业务逻辑3", order));
checkResultDispatcher.put("校验4", order -> String.format("对%s执行业务逻辑4", order));
checkResultDispatcher.put("校验5", order -> String.format("对%s执行业务逻辑5", order));
checkResultDispatcher.put("校验6", order -> String.format("对%s执行业务逻辑6", order));
checkResultDispatcher.put("校验7", order -> String.format("对%s执行业务逻辑7", order));
checkResultDispatcher.put("校验8", order -> String.format("对%s执行业务逻辑8", order));
checkResultDispatcher.put("校验9", order -> String.format("对%s执行业务逻辑9", order));
}
@Override
public String getCheckResultSuper(String order) {
//从逻辑分派Dispatcher中获得业务逻辑代码,result变量是一段lambda表达式
Function<String, String> result = checkResultDispatcher.get(order);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(order);
}
return "不在处理的逻辑中返回业务错误";
}
通过http调用一下看看效果:
@RestController
public class BizController {
@Autowired
private IMapClueService mapClueService;
@GetMapping("/v1/biz/testSuper")
public String test2(String order) {
return mapClueService.getCheckResultSuper(order);
}
}
此文章仅用于学习参考的记录笔记