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


       寫這篇文章的目的和上一篇單例模式一樣,策略模式也是一種常用的設計模式,太多的if-else不僅看着不太美觀而且不好維護,對於自己來說也等於復習了一遍策略模式。先說一下策略

模式的定義:

       策略模式封裝了算法家族,可以讓彼此之間互相替換,簡單的來說就是比如之前系統調用了兩個數據源,現在要添加第三個數據源如果還是使用if-else就需要給所有調用數據源的地方加上

新的判斷分支,從而導致維護繁瑣。如以下代碼:

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

     如果將來隨着業務變得復雜,加入C數據源,還要接着加入else if分支,以此類推工作量會越來越繁瑣,而且加入了大量冗余代碼。。。。

     使用了策略模式之后:只需要在策略類Strategy中定義一個調用所有數據源的公共借口就可以

public abstract class Strategy {

    public abstract void dataInterface();
}

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

public class DataStrategyA extends Strategy {

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

}

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

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層數超過三層的時候要使用策略模式,

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM