一切抛开业务的设计,都是扯淡!在项目中有个我们会对多个接口进行多业务逻辑判断,项目开始工期紧,所以先以实现功能为主,最近打算优化一番,一开始的代码是这样的
public void checkProjectAdd(List<OrderDetail> list) {
if (!CollectionUtils.isEmpty(list)) {
orderService.check(list);
stockService.check(list);
orderAddress.check(list);
userScoreService.check(list);
activityService.check(list);
this.check();
}
excute();
}
虽然对检查类的方法做了简单的封装,但在好多地方可能会存在重复的判断,比如订单提交,加入购物车等等,冗余代码随处可见,且不易扩展。在此情形下,废话不多说,准备开干,先来分析分析业务,因为我们的各个检查接口的处理原则是要保证顺序性的,而在检查的过程中可能根据商品提交参数而实质去动态改变list参数中的内容,比如一个库存当两个卖,用户会员等级结合实际商品数判断能否享受折扣等等,所以每一级的检查或手动处理值都是要求检查类代码执行顺序,思前想后,想起曾在阅读mybatis源码时觉得其设计的plugins模式很适合此类场景,于是决定使用《责任链模式》来进行这一次代码的优化。
首先简单介绍一下什么是责任链,说到链,大家就能想到链表,这里我们只说