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