目錄
1、核心思想
2、實現方式
2.1 模式結構
2.2 實現案例
3、優缺點分析
4、適用場景
5、優化技巧
1、核心思想
目的:將算法(行為)抽象出來作為一系列策略類,使他們可以相互替換,使系統擁有“可插拔”擴展的能力。
舉例:
1> 游戲卡帶:可插卡式的游戲機
2> 計算器:固定是兩個輸入和一個輸出的結構,不同的算法實現類(加、減、乘、除等)
3> 萬能的USB口:不同設備捕獲數據(如鍵盤設備捕獲的是鍵盤指令數據,鼠標設備捕獲的是坐標與點擊指令數據,攝像頭設備捕獲的是視頻流數據)
2、實現方式
2.1 模式結構
三個核心角色:
- ?Strategy(策略接口)?:定義通用的策略規范標準,包含在系統環境中并聲明策略接口標準。
- ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC……(策略實現)?:實現了策略接口的策略實現類,可以有多種不同的策略實現,但都得符合策略接口定義的規范。
- Context(系統環境)?:包含策略接口引用的系統環境,對外提供更換策略實現的方法setStrategy()以及執行策略的方法executeStrategy(),其本身并不關心執行的是哪種策略實現。
2.2 實現案例
舉例:電商促銷策略
// 策略接口
public interface DiscountStrategy {double applyDiscount(double price);
}// 具體策略:無折扣
public class NoDiscount implements DiscountStrategy {@Overridepublic double applyDiscount(double price) {return price;}
}// 具體策略:8折
public class TwentyPercentOff implements DiscountStrategy {@Overridepublic double applyDiscount(double price) {return price * 0.8;}
}// 具體策略:滿300減50
public class FullReduction implements DiscountStrategy {@Overridepublic double applyDiscount(double price) {return price >= 300 ? price - 50 : price;}
}// 上下文類(訂單)
public class Order {private DiscountStrategy strategy;public void setStrategy(DiscountStrategy strategy) {this.strategy = strategy;}public double checkout(double price) {return strategy.applyDiscount(price);}
}// 客戶端
public class Client {public static void main(String[] args) {Order order = new Order();order.setStrategy(new TwentyPercentOff());System.out.println("最終價格:" + order.checkout(400)); // 輸出 320.0}
}
3、優缺點分析
優點:
-
開閉原則:新增算法時無需修改現有代碼,只需添加新策略類。
-
解耦算法與業務邏輯:算法獨立于客戶端,易于擴展和維護。
-
消除條件分支:避免代碼中復雜的?
if-else
?邏輯。 -
復用性:不同策略可被多個客戶端共享使用。
缺點:
-
類數量增加:每個策略需要一個類,可能導致類膨脹。
-
客戶端需了解策略差異:客戶端需要知道不同策略的適用場景。
-
性能開銷:頻繁切換策略可能帶來對象創建和銷毀的開銷(可通過享元模式優化)。
4、適用場景
-
多種算法需要動態切換
-
例如:支付方式(支付寶、微信、銀行卡)、排序算法(快速排序、歸并排序)。
-
-
需要隱藏算法實現細節
-
例如:加密算法(AES、RSA)、數據壓縮(ZIP、RAR)。
-
-
替代復雜的條件分支
-
例如:電商促銷策略(滿減、折扣、贈品)。
-
-
系統需要靈活擴展新算法
-
例如:機器學習模型的不同訓練策略。
-
5、優化技巧
策略對象的創建優化
-
若策略無狀態,可復用為單例(如?
Collections.sort()
?中的?Comparator
)。
結合Lambda簡化代碼
-
在支持函數式編程的語言(如Java 8+),可用Lambda替代簡單策略類。
context.setStrategy(data -> System.out.println("Lambda策略處理:" + data));
策略枚舉化
-
對于有限的策略集合,可使用枚舉類實現策略模式。
public enum DiscountType implements DiscountStrategy {NO_DISCOUNT { /* 實現方法 */ },TWENTY_PERCENT { /* 實現方法 */ };
}