日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

發布時間:2025/6/17 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、策略模式簡介
  • 二、策略模式適用場景
  • 三、策略模式優缺點
  • 四、策略模式與其它設計模式
  • 五、策略模式代碼示例
    • 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();} }

總結

以上是生活随笔為你收集整理的【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。