在編碼中難免遇到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);
}
}