策略模式 Strategy是一種相對比較簡單的行為型設計模式,與狀態模式有一定的類似,策略模式將演算法概念進行抽象,抽象為同一介面,面向介面編程,狀態模式也是類似,本質仍舊是面向抽象編程,本文對策略模式進行了簡單介紹,給出了意圖結構以及java實現示例。 ...
策略模式 Strategy
![image_5c21cbb4_55b2 image_5c21cbb4_55b2](https://img2018.cnblogs.com/blog/897393/201812/897393-20181225141940838-716734557.png)
![image_5c21cbb4_3b5 image_5c21cbb4_3b5](https://img2018.cnblogs.com/blog/897393/201812/897393-20181225141941587-509551365.png)
if(totalPrice > 1000){ //9折 else if(totalPrice > 2000){ //8折 }else if(totalPrice > 3000){ //7折 }這就是一種打折策略,對應於購物總金額的不同,採用不同的處理方法。 顯然,使用條件分支或者選擇語句,類似狀態模式中的分析,也存在類似的問題 如果條件過多,會導致處理邏輯複雜 而且,策略的邏輯與業務邏輯耦合在一起,如果處理方法變化還需要修改業務邏輯方法,擴展性差 而且,也不適合增加新的策略方案
意圖
定義一系列的演算法,把他們一個個的封裝起來,並使他們可以互相轉換,本模式使得演算法可以獨立於使用它的客戶端而變化。 別名:政策Policy 策略模式與狀態模式本質一樣,只不過一個是狀態,一個是行為演算法。結構
![image_5c21cbb4_22ad image_5c21cbb4_22ad](https://img2018.cnblogs.com/blog/897393/201812/897393-20181225141942106-1816607220.png)
代碼示例
排序介面,定義了一個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(); } }
![image_5c21cbb4_406f image_5c21cbb4_406f](https://img2018.cnblogs.com/blog/897393/201812/897393-20181225141942582-1969861121.png)