if...else代碼優化

在編碼中難免遇到if else過多情況,一方面是當初設計沒有在意,另一方面可能是因爲需求的不斷變化。但代碼中出現大量if else都知道這種情況不太好,那麼我們就聊一下這種情況應該如何優化

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

1.表驅動

表驅動是指用查表的方式獲取值

private static Map<Status, Function<Integer, Integer>> 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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章