【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目錄
- 一、策略模式簡介
- 二、策略模式適用場景
- 三、策略模式優缺點
- 四、策略模式與其它設計模式
- 五、策略模式代碼示例
- 1、促銷策略接口
- 2、滿減促銷策略
- 3、返現促銷策略
- 4、空促銷策略
- 5、促銷策略工廠
- 6、促銷活動
- 7、測試類
一、策略模式簡介
策略模式 : 定義了 算法家族 , 分別 封裝起來 , 讓它們之間 , 可以 相互替換 , 此模式 讓 算法的變化 不會影響到 使用算法的用戶 ;
將 不同的算法 , 封裝到 不同的類 中 , 讓它們之間可以 相互替換 ,
使用算法的用戶 即 應用層 , 感知不到 算法已經被替換了 ;
實際的業務場景 :
- 不同業務邏輯 : 商品促銷 , 促銷策略 , 不同的促銷策略算法 , 封裝到不同的類中 ;
- 代碼優化 : 如果代碼中 , 有大量的 if … else … 代碼 , 可以通過策略模式 , 替換相關邏輯 ;
策略模式類型 : 行為型 ;
二、策略模式適用場景
策略模式適用場景 :
-
行為切換 : 系統有 很多類 , 這些類的區別僅僅在于它們的 行為不同 ; 使用策略模式 , 可以 動態地 讓 用戶對象 在這些行為中, 選擇一個行為 ;
將對象的 不同的行為 , 封裝到 不同的類 中 , 每個行為對應一種策略 ; -
算法選擇 : 系統中需要 動態地 在 幾種算法 中 選擇一種 ;
算法 就是 策略 , 其中封裝了一系列的業務邏輯及計算方式 ;
如 : 計算方式 , 給定兩個數字 ; 使用加法策略 , 將兩個數相加 ; 使用乘法策略 , 將兩個數相乘 ;
三、策略模式優缺點
策略模式優點 :
- 開閉原則 : 策略模式 提供了 對 開閉原則 的支持 , 可以在不修改原有系統的基礎上 , 選擇不同的行為 , 也可以 額外擴展其它行為 ;
- 避免代碼冗余 : 可以 避免使用多重條件判定語句 ; 可以避免出現大量的 if … else … 語句 , switch 語句等 ;
- 安全保密 : 策略模式可以 提高算法的 保密性 和 安全性 ; 在終端使用策略時 , 只需要知道策略的作用即可 , 不需要知道策略時如何實現的 ;
策略模式缺點 :
-
策略類選擇 : 客戶端 必須 知道所有的 策略類 , 并且自行決定 使用哪個策略類 ;
-
增加復雜性 : 如果系統很復雜 , 會 產生很多策略類 ;
四、策略模式與其它設計模式
策略模式與工廠模式 :
-
工廠模式 : 接受指令 , 創建出符合要求的具體對象 ;
工廠模式 分為 工廠方法模式 和 抽象工廠模式 , 工廠模式 是 創建型的設計模式 , 策略模式 是 行為型的設計模式 ; -
策略模式 : 接受創建好的實例對象 , 從而實現不同的行為 ;
策略模式與狀態模式 :
- 策略模式 : 使用策略模式時 , 客戶端 需要知道使用哪個策略 ;
- 狀態模式 : 使用狀態模式時 , 客戶端 不需要知道具體的狀態 , 這些狀態之間會自動轉換 ;
設計模式選擇 :
-
狀態模式 : 如果系統中 , 某個對象存在多種狀態 , 在不同狀態下 , 行為有差異的話 , 使用狀態模式 ;
-
策略模式 : 如果系統中 , 某個類的某個行為 , 有多種實現方式 , 使用策略模式 ;
策略模式 一般不是獨立使用的 , 可能需要結合單例 , 工廠模式 , 享元模式 等多個設計模式 , 一起實現業務邏輯 ;
如果遇到大量的 if … else … 可以考慮是否可以抽象 對象 以及 行為 , 將其封裝成策略模式 ;
如果一個對象的行為經常變化 , 擴展性要求比較高 , 也可以考慮使用策略模式 ;
五、策略模式代碼示例
業務場景 :
商場促銷活動 : 促銷是商品的一個行為 , 促銷行為 , 設置多個促銷行為 , 將其封裝到類中 ;
1、促銷策略接口
package strategy;/*** 促銷策略接口* 所有的促銷策略 , 都要實現該接口*/ public interface PromotionStrategy {/*** 促銷活動*/void doPromotion(); }
2、滿減促銷策略
package strategy;/*** 滿減促銷策略* 滿 100 減 20*/ public class ManJianPromotionStrategy implements PromotionStrategy {@Overridepublic void doPromotion() {System.out.println("滿減促銷 , 滿 100 減 20");} }
3、返現促銷策略
package strategy;/*** 返現促銷策略* 購買后返優惠券*/ public class FanXianPromotionStrategy implements PromotionStrategy {@Overridepublic void doPromotion() {System.out.println("返現促銷 , 返優惠券 10 元");} }
4、空促銷策略
package strategy;/*** 空的促銷策略* 為了防止空指針*/ public class EmptyPromotionStrategy implements PromotionStrategy{@Overridepublic void doPromotion() {System.out.println("原價出售");} }
5、促銷策略工廠
package strategy;import java.util.HashMap;/*** 促銷策略工廠*/ public class PromotionStrategyFactory {private static HashMap<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();static {PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN, new ManJianPromotionStrategy());PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN, new FanXianPromotionStrategy());}/*** 構造函數不能被外界訪問*/private PromotionStrategyFactory() {}/*** 根據傳入的鍵值獲取相應的促銷策略* @param promotionKey* @return*/public static PromotionStrategy getPromotionStrategy(String promotionKey) {PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);return promotionStrategy != null ? promotionStrategy : new EmptyPromotionStrategy();}/*** 使用這種方式聲明常量 , 可以起到邏輯上分組的作用*/public interface PromotionKey {String MANJIAN = "ManJian";String FANXIAN = "FanXian";} }
6、促銷活動
package strategy;/*** 促銷活動*/ public class PromotionActivity {/*** 促銷策略 , 通過構造器注入*/private PromotionStrategy promotionStrategy;public PromotionActivity(PromotionStrategy promotionStrategy) {this.promotionStrategy = promotionStrategy;}/*** 執行促銷策略*/public void executePromotionStrategy() {this.promotionStrategy.doPromotion();} }
7、測試類
package strategy;public class Main {public static void main(String[] args) {// 獲取促銷策略PromotionStrategy promotionStrategy = PromotionStrategyFactory.getPromotionStrategy(PromotionStrategyFactory.PromotionKey.FANXIAN);// 創建促銷活動 , 并執行促銷策略PromotionActivity promotionActivity = new PromotionActivity(promotionStrategy);// 執行促銷策略promotionActivity.executePromotionStrategy();} }
總結
以上是生活随笔為你收集整理的【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【设计模式】观察者模式 ( 简介 | 适
- 下一篇: 【设计模式】迭代器模式 ( 简介 | 适