工作中看到过各种if else语句在代码中堆积,其中一些完全可以通过设计模式来处理,让代码更加清晰干净清爽并易扩展。今天分享一下通过模板模式优化该问题方法。
之前工作中遇到一段前辈们留下的代码,业务需求是程序通过消费MQ来加工数据, 这些MQ主题不同, 对应的业务逻辑不同,但消息体结构相同,所以在同一个方法中加工处理。其中,每个主题的消息体中有不同的状态属性,类似topic1:{"status":1, "name":"发快递"},topic2:{"status":2,"name":"检测快递"},topic3:{"status":3,"name":"收快递"}。在项目代码中,自然看到了一堆if else,通过消息体中的status值来判断消息体来自哪个消息,并执行对应的处理逻辑。代码不仅冗长,而且不易扩展,如果此时要增加一个状态,就要增加一个else分支处理, 就意味着业务代码需要变动。(PS:真实需求比较复杂,这里只是简单介绍一下类似的场景)。
if(status == 1){
doSend();
}else if(status == 2){
doCheck();
}else if(status == 3){
doPickUp();
}
优化开始, 通过模板模式优化上述的if else语句
首先定义一个处理各种快递状态的抽象类ExpressProcess
public abstract class ExpressProcess{
public abstract ExpressData doSomething();
}
然后, 分别定义各个快递状态的处理类,这些处理类继承ExpressProcess,并各自重写doSomething()方法,执行各自的业务逻辑
public class SendExpress extends ExpressProcess {
public ExpressData doSomething() {
System.out.println("发快递");
return new ExpressData();
}
}
public class PickUpExpress extends ExpressProcess {
public ExpressData doSomething() {
System.out.println("收快递");
return new ExpressData();
}
}
写一个测试类,测试一下
public class TestDemo {
private static Map<String,ExpressProcess> expressProcess = new HashMap<String,ExpressProcess>();
static {
//处理类注册
expressProcess.put("send", new SendExpress());
expressProcess.put("pickkup", new PickUpExpress());
}
public static void main(String[] args) {
//状态不同,处理类及结果不同
String status = "send";
ExpressData data = expressProcess.get(status).doSomething();
}
}
可以看到,map根据状态找到对应的处理类,并执行方法处理对应业务逻辑。每次的处理结果随着状态不同而不同。如果有新的状态增加,只需要添加一个处理类并在map中注册即可,原业务代码无需改动也避免了大量if else语句。