?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。
🍎個人主頁:Meteors.的博客
💞當前專欄:設計模式
?特色專欄:知識分享
🥭本文內容:23種設計模式——策略模式 (Strategy Pattern)?詳解
📚 ** ps **? :閱讀文章如果有問題或者疑惑,歡迎在評論區提問或指出。
目錄
一. 背景
二. 簡介
三. 核心思想
四. 主要角色
五. 簡單demo(Java)
六. 策略模式的優點
七. 策略模式的缺點
八. 總結
一. 背景
我原本也不知道策略模式是什么......知道有一天,發現手上需求的底層用的就是策略模式,于是才恍然大悟。于是結合網上的一些資料,完成了這篇博客。
二. 簡介
策略模式?? 是一種行為型設計模式,它定義了一系列算法,并將每個算法封裝起來,使它們可以互相替換。策略模式讓算法的變化獨立于使用算法的客戶端。
大白話講,就是定義了幾個表示不同類型的類,讓它們可以作為參數傳入管理類的同一個方法中——至于為什么都滿足管理類的方法參數條件,因為這些類型類都實現了一個相同的基類.......
三. 核心思想
- 定義一組算法??:把它們封裝成獨立的類(即策略類),這些類實現相同的接口或繼承相同的抽象類。
- 運行時動態選擇算法??:客戶端在使用時根據需要選擇具體的策略,而不需要修改使用算法的代碼。
- 遵循開閉原則(OCP)??:對擴展開放,對修改關閉。新增策略時無需修改已有代碼。
四. 主要角色
- Context(上下文)??
持有一個策略對象的引用,負責與客戶端交互,并調用策略對象的方法來執行具體行為。- Strategy(策略接口)??
定義所有支持的算法或行為的公共接口。- ConcreteStrategy(具體策略類)??
實現 Strategy 接口,提供具體的算法實現。
五. 簡單demo(Java)
下面代碼模擬了一個電商系統,針對不同用戶類型(如普通用戶、VIP用戶)有實現不同的折扣策略。
// Strategy: 折扣策略接口 public interface DiscountStrategy {double applyDiscount(double originalPrice); }
// ConcreteStrategy: 普通用戶無折扣 public class NoDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice;} }// ConcreteStrategy: VIP用戶打8折 public class VipDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice * 0.8;} }
// Context: 負責使用策略 public class PricingContext {private DiscountStrategy discountStrategy;// 設置策略public void setDiscountStrategy(DiscountStrategy strategy) {this.discountStrategy = strategy;}// 執行折扣計算public double calculatePrice(double originalPrice) {if (discountStrategy == null) {throw new IllegalStateException("未設置折扣策略");}return discountStrategy.applyDiscount(originalPrice);} }
public class Client {public static void main(String[] args) {PricingContext context = new PricingContext();double price = 100.0;// 普通用戶,無折扣context.setDiscountStrategy(new NoDiscountStrategy());System.out.println("普通用戶價格: " + context.calculatePrice(price)); // 輸出 100.0// VIP用戶,打8折context.setDiscountStrategy(new VipDiscountStrategy());System.out.println("VIP用戶價格: " + context.calculatePrice(price)); // 輸出 80.0} }
通過上面的這些代碼,通過簡單的改變參數,就實現了對價格計算的快速替換,減少了if/else的判斷邏輯,讓代碼更加簡潔,并且容易擴展。
六. 策略模式的優點
- ??開閉原則??:新增策略不影響現有代碼。
- 消除條件語句??:避免大量的 if-else 或 switch-case。
- 提高可維護性與可擴展性??:策略實現獨立,易于理解和替換。
- 算法復用??:策略可以在不同的上下文中復用。
七. 策略模式的缺點
- 客戶端必須了解不同策略??:客戶端需要知道有哪些策略并選擇合適的策略。
- 類數量增多??:每一種策略都是一個類,可能會增加類的數量。
- 策略對象之間的通信較復雜時處理不便??:如果策略之間有依賴關系,可能需要額外設計。
八. 總結
策略模式是一種行為型模式。通過定義一系列封裝并可互換算法,以達到避免大量條件判斷,實現算法的靈活切換和擴展的目的。
最后,
? ? ? ? 其它設計模式會陸續更新,希望文章對你有所幫助!