在编码中难免遇到if else过多情况,一方面是当初设计没有在意,另一方面可能是因为需求的不断变化。但代码中出现大量if else都知道这种情况不太好,那么我们就聊一下这种情况应该如何优化

if(条件1){
    ....
}else if(条件2){
    ....
}else if(条件3){
    ....
}else{
    ....
}

1.表驱动

表驱动是指用查表的方式获取值

private static Map> conditions;
static {
    conditions = new HashMap<>();
    conditions.put(Status.CONDITION1,(t)->{
        return t+1;
    });
    conditions.put(Status.CONDITION2,(t)->{
        return t+2;
    });
}

@Test
public void test(){
    Integer apply = conditions.get(Status.CONDITION1).apply(1);
    System.out.println(apply);
}

enum Status{
    CONDITION1,CONDITION2;
}

2.责任链模式

当判断条件复杂多变时,就无法使用上述的驱动表了。
责任链使用比较多的场景比如:Filter、Interceptor。

abstract class Handler {

    protected Handler next;

    public void setNext(Handler next) { // 设置下一个处理者
        this.next = next;
    }

    public abstract void handlerRequest(int request); // 请求处理逻辑
}

class ConcreteHandler1 extends Handler {
    @Override
    public void handlerRequest(int request) {
        if (request >= 0) {
            System.out.println("request >= 0");
        } else {
            // 如果不满足条件进行下一次
            next.handlerRequest(request); // 将请求发送给下一位
        }
    }
}
class ConcreteHandler2 extends Handler {
    @Override
    public void handlerRequest(int request) {
        if (request >= 10) {
            System.out.println("request >= 10");
        } else {
            // 如果不满足条件进行下一次
            next.handlerRequest(request); // 将请求发送给下一位
        }
    }
}

public class TestHandler {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        // 设置责任链的下家
        handler1.setNext(handler2);
        handler1.handlerRequest(8);
    }
}