有效的減小代碼中太多的if、else?-策略模式

       寫這篇文章的目的和上一篇單例模式同樣,策略模式也是一種經常使用的設計模式,太多的if-else不只看着不太美觀並且很差維護,對於本身來講也等於複習了一遍策略模式。先說一下策略java

模式的定義:算法

       策略模式封裝了算法家族,可讓彼此之間互相替換,簡單的來講就是好比以前系統調用了兩個數據源,如今要添加第三個數據源若是仍是使用if-else就須要給全部調用數據源的地方加上設計模式

新的判斷分支,從而致使維護繁瑣。如如下代碼:單元測試

if(A){
     System.out.println("調用A數據源");
}else if(B){
     System.out.println("調用B數據源");
}

     若是未來隨着業務變得複雜,加入C數據源,還要接着加入else if分支,以此類推工做量會愈來愈繁瑣,並且加入了大量冗餘代碼。。。。測試

     使用了策略模式以後:只須要在策略類Strategy中定義一個調用全部數據源的公共藉口就能夠this

public abstract class Strategy {spa

    public abstract void dataInterface();
}設計

     DataStrategyA,封裝了調用A數據源的方法,繼承於Strategy3d

public class DataStrategyA extends Strategy {

    public void dataInterface() {
        System.out.println("調用A數據源");
    }

}

    DataStrategyB,封裝了調用B數據源的方法,繼承於Strategycode

public class DataStrategyB extends Strategy {

    public void dataInterface() {
         System.out.println("調用B數據源");
    }

}

    Context算法調用類,根據具體策略對象調用相應的方法

public class Context {

    private Strategy strategy;
    
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public void contextInterface() {
        strategy.dataInterface();
    }
}

     運行效果以下:

public class Test {

    public static void main(String[] args) {
        Context context = new Context(new DataStrategyB());
        context.contextInterface();

    }

}

      這樣就解決了繁瑣的if-else操做了,就算之後加入C、D數據源也只須要增長兩個策略類就能夠了

      此外,策略模式還有一個優勢就是簡化了單元測試,每一個方法都有本身獨立的類,能夠經過本身的接口進行單獨測試

     固然策略模式也存在着缺點,就是增長了大量的策略類,要求每一個開發人員都要了解。策略模式的優勢、缺點都說完了怎麼樣取捨就看你們本身了。不過仍是建議你們

使用策略模式。阿里巴巴的java開發手冊中也明確表示了if層數超過三層的時候要使用策略模式,

相關文章
相關標籤/搜索