if else與策略模式

zko0發表於2023-03-08

1、前言

學習策略模式,對於大量的if else邏輯可以進行替換,使程式碼變得更加優雅簡潔。

2、編寫

①傳統if else

使用if elsearg進行判斷,對於不同的判斷進行不同的邏輯操作;

public class Simple {
    void simple(String arg){
        if ("1".equals(arg)){
            //操作1
        }else if ("2".equals(arg)){
            //操作2
        }
    }
}

②策略模式(未完成版)

假設傳入level為vip等級,對於不同等級進行不同會員等級的操作

一.策略抽象介面

定義一個策略介面,不同VIP等級操作類實現該介面

public interface VIPStrategy {
    public void handle();
}

二.策略實現類

一級VIP實現類:

public class VIP1StrategyImpl implements VIPStrategy{
    @Override
    public void handle() {
        System.out.println("會員等級1");
    }
}

二級VIP實現類:

public class VIP2StrategyImpl implements VIPStrategy{
    @Override
    public void handle() {
        System.out.println("會員等級2");
    }
}

三.策略工廠

透過level引數返回不同的策略實現類,進行操作

public class VIPStrategyFactory {
    
    public static final Map<String,VIPStrategy> map=new HashMap<>();

    static {
        map.put("vip1",new VIP1StrategyImpl());
        map.put("vip2",new VIP2StrategyImpl());
    }
    
    public static VIPStrategy getVipStrategy(String level) {
        return map.get(level);
    }

}

四.對比if else

public class NotGood {
    void notGood(String arg){
        VIPStrategy vipStrategy = VIPStrategyFactory.getVipStrategy(arg);
        vipStrategy.handle();
    }
}

③策略模式(完成版)

上面我們使用具體的VIPStrategy實現類進行了處理,如果我們對VIP需要新增通用方法,可以使用上下文(裝飾器模式)封裝他們的通用處理:在execute執行方法中,新增通用操作:

public class VIPContext {
    
    private VIPStrategy vipStrategy;

    public VIPContext(VIPStrategy vipStrategy) {
        this.vipStrategy = vipStrategy;
    }

    public void executeStrategy(){
        System.out.println("VIP通用處理");
        vipStrategy.handle();
    }

}

編寫完成,簡單測試一下:

public class Good {
    void good(String arg){
        VIPStrategy vip1 = VIPStrategyFactory.getVipStrategy("vip1");
        VIPContext vipContext = new VIPContext(vip1);
        vipContext.executeStrategy();
    }

    public static void main(String[] args) {
        Good good = new Good();
        good.good("vip1");
    }
}

image-20230308191938718

3、總結

使用策略模式代替if else確實能讓程式碼的邏輯更加清晰,但是僅限於大量的if else,使用策略模式可以觀察到,程式碼量會急劇膨脹

我的建議:

1-3個分支:if else

3-5個分支:switch

更多:使用策略模式

不過還是看個人的喜好,按你的選擇即可

相關文章