策略模式 Strategy是一種相對比較簡單的行為型設計模式,與狀態模式有一定的類似,策略模式將演算法概念進行抽象,抽象為同一介面,面向介面編程,狀態模式也是類似,本質仍舊是面向抽象編程,本文對策略模式進行了簡單介紹,給出了意圖結構以及java實現示例。 ...
策略模式 Strategy 與策略相關的常見辭彙有:營銷策略、折扣策略、教學策略、記憶策略、學習策略.... “策略”意味著分情況討論,而不是一概而論 面對不同年齡段的人,面對不同的商品,必然將會有不同的話術; 面對購物總價的範圍,很可能會有不同的折扣方案; 面對理解能力不同的學生,必然有不同的教學策略; 而在我們程式的世界里,“策略”就是分情況討論。也就是類似狀態模式中的條件分支或者選擇分支。 只不過狀態模式中是事物的不同狀態,而策略模式中關註的是處理方法。 比如
if(totalPrice > 1000){ //9折 else if(totalPrice > 2000){ //8折 }else if(totalPrice > 3000){ //7折 }這就是一種打折策略,對應於購物總金額的不同,採用不同的處理方法。 顯然,使用條件分支或者選擇語句,類似狀態模式中的分析,也存在類似的問題 如果條件過多,會導致處理邏輯複雜 而且,策略的邏輯與業務邏輯耦合在一起,如果處理方法變化還需要修改業務邏輯方法,擴展性差 而且,也不適合增加新的策略方案
意圖
定義一系列的演算法,把他們一個個的封裝起來,並使他們可以互相轉換,本模式使得演算法可以獨立於使用它的客戶端而變化。 別名:政策Policy 策略模式與狀態模式本質一樣,只不過一個是狀態,一個是行為演算法。結構
抽象策略角色Strategy 定義了抽象的策略,比如打折,排序等 定義了策略的一致性訪問介面,比如定義了一個排序介面 sort() 具體策略角色ConcreteStrategy 實現抽象策略的定義的介面,實現自己的行為演算法,比如ConcreteStrategyA冒泡 ConcreteStrategyB快排 環境類Context 維護Strategy,持有一個Strategy的引用,用來管理Strategy,可以切換策略 是Strategy的使用者代碼示例
排序介面,定義了一個sort方法package strategy; public interface SortStrategy { void sort(); }
package strategy; public class Bubble implements SortStrategy { @Override public void sort() { System.out.println("冒泡排序,輸出結果..."); } }
package strategy; public class QuickSort implements SortStrategy { @Override public void sort() { System.out.println("快速排序,輸出結果..."); } }環境類 內部持有一個SortStrategy,簡單起見初始化為Bubble 使用一個簡單的方法進行切換 並且提供sort方法,代理strategy的sort方法
package strategy; public class Context { private SortStrategy strategy = new Bubble(); public void setStrategy(String strategy) { if(strategy.equals("bubble")){ this.strategy = new Bubble(); }else if(strategy.equals("quick")){ this.strategy = new QuickSort(); } } public void sort() { strategy.sort(); } }測試方法
package strategy; public class Test { public static void main(String[] args) { Context context = new Context(); context.sort(); context.setStrategy("quick"); context.sort(); context.setStrategy("bubble"); context.sort(); } }
上面的代碼可以看得出來,具體的演算法行為,被封裝在了具體的策略類中,比如Bubble和QuickSort 通過環境類Context對演算法進行管理切換。