寫這篇文章的目的和上一篇單例模式同樣,策略模式也是一種經常使用的設計模式,太多的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層數超過三層的時候要使用策略模式,