登陆

还在事务顶用if else,战略形式了解一下

admin 2019-09-06 265人围观 ,发现0个评论

前段时间,我将公司体系中的批量审单的功用进行了重构,用到了java的并发编程进行异步化处理,数据库的达观锁机制处理多线程并发更新数据。其间批量审单的事务处理涉及到多种使命类型,对应不同的事务办法进行处理,比方转仓,转快递,增加赠品,删去赠品,拆分订单,批量驳回,批量报废等等,其间就用到了战略形式。

if else形式

 if ("BATCH_CHANGE_WAREHOUSE".equals(taskType)) {
//批量转仓逻辑
} else if ("BATCH_CHANGE_SHIPPING".equals(taskType)) {
//批量转快递逻辑
} else if ("BATCH_REPLACE_ORDER_GOODS".equals(taskType)) {
//批量替换订单产品逻辑
} else if ("BATCH_DELETE_ORDER_GOODS".equals(taskType)) {
//批量删去订单产品逻辑
} else if ("BATCH_ADD_MEMO".equals(taskType))bg {
//批量增加补白逻辑
} else {
//使命类型不知道
System.out.println("使命类型无法处理");
}

看起来,思路清晰,if,else分支也很清楚,但不觉得代码很臃肿,保护起来费事吗,尤其是其他人来接锅的时分,连看下去的愿望都没有了。这时分你需要用战略形式消除其间的if else,进行一下简略的重构!

战略形式

1、首要笼统事务处理器

public abstract class InspectionSolver {
public abstract void sol还在事务顶用if else,战略形式了解一下ve(Long orderId, Long userId);
public abstract String[] supports();
}

2、将事务处理器和其支撑处理的类型放到一个容器中,java里Map便是最常用的容器之一

@Component
public class InspectionSolverChooser implements ApplicationContextAware{
private Map chooseMap = new HashMap<>();
public InspectionSolver choose(String type) {
return chooseMap.get(type);
}
@PostConstruct
public void register() {
Map solverMap = context.getBeansOfType(InspectionSolver.class);
for (InspectionSolver solver : solverMap.values()) {
for (String support : solver.supports()) {
chooseMap.put(support,solver);
}
}
}
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context=applicationContext;
}
}

这里是在使用发动的时分,加载spring容器中所有InspectionSolver类型的处理器,放到InspectionSolverChooser的map容器中。留意是InspectionSolver类型,所以界说的处理器都得承继InspectionSolver,其次是spring容器中的才干加载,所以界说的处理器都得放到spring容器中(@Component注解不能少)

3、界说不同的处理器

@Component
public class ChangeWarehouseSolver extends InspectionSolver {
@Override
public void solve(Long orderId, Long userId) {
System.out.println("订单"+orderId+"开端进行批量转仓了。。");
}
@Override
public String[] supports() {
return new String[] {InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_WAREHOUSE};
}
}
@Component
public class ChangeShippingSolver extends InspectionSolver{
@Override
public void solve(Long orderId, Long userId) {
System.out.println("订单"+orderId+"开端进行转快递了。。");
}
@Override
public String[] supports() {
return new String[] {InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_SHIPPING};
}
}
@Component
public class ReplaceOrderGoodsSolver extends InspectionSolver{
@Override
public void solve(Long orderId, Long userId) {
System.out.println("订单"+orderId+"开端进行替换产品了");
}
@Override
public String[] supports() {
return new String[]{InspectionConstant.INSPECTION_TASK_TYPE_BATCH_REPLACE_ORDER_GOODS};
}
}

4、测验类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=Application.class)// 指定spring-boot的发动类
public class InspectionTest {
@Autowired
pr还在事务顶用if else,战略形式了解一下ivate InspectionSolverChooser chooser;
@Test
public void test() throws Exception{
//预备数据
String taskType = InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_WAREHOUSE;
Long orderId = 12345L;
Long userId = 123L;
//获取使命类型对应的solver
InspectionSolver solver = chooser.choose(taskType);
if (solver == null) {
throw new RuntimeExceptio还在事务顶用if else,战略形式了解一下n(还在事务顶用if else,战略形式了解一下"使命类型暂时无法处理!");
}
//调用不同solver的办法进行处理
solver.solve(orderId,userId);
}
}

在测验类中我消除了或许一长段的if else,从选择器InspectionSolverChooser中依据type的不同取出不同的使命处理器InspectionSolver,然后调用其solve()办法进行使命处理,不同处理器调用的当然便是不同的solve()办法了,意图到达。

作者:坚持便是胜利来历:掘金原文:juejin.im/post/5d12228de51d45775c73dd1b
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP