一、什么是策略模式?
策略模式(Strategy Pattern)是一種行為型設計模式,它將一組算法或業務邏輯封裝為獨立的策略類,使這些策略可以互換使用,并通過上下文類動態選擇合適的策略。
核心思想
? 將不同的行為或算法獨立封裝為策略類,客戶端無需關注內部實現邏輯。
? 遵循開閉原則(OCP),新增策略時無需修改已有代碼,避免復雜的if-else判斷邏輯。
策略模式的關鍵結構
1.策略接口(Strategy)
定義一組算法的通用接口。
2.具體策略(Concrete Strategy)
每個具體策略實現不同的算法。
3上下文類(Context)
上下文類持有策略接口的引用,用于調用具體策略。
二、策略模式的實際案例
場景:訂單支付系統(支持支付寶、微信和銀聯支付)。
直接實現(未使用策略模式):
public class PaymentService {public void pay(String paymentType, double amount) {// 支付寶支付if ("ALIPAY".equals(paymentType)) {System.out.println("Using Alipay to pay: " + amount);// 微信支付} else if ("WECHAT".equals(paymentType)) {System.out.println("Using WeChat Pay to pay: " + amount);// 銀聯支付 } else if ("UNIONPAY".equals(paymentType)) {System.out.println("Using UnionPay to pay: " + amount);} else {System.out.println("Unsupported payment type!");}}
}
問題分析
1.違反開閉原則:每新增一種支付方式,都需要修改pay()方法,代碼難以維護。
2.可讀性和擴展性差:復雜條件判斷導致代碼臃腫,增加閱讀和測試成本。
3.高耦合性:支付邏輯直接耦合在調用代碼中,難以重用和擴展。
使用策略模式實現
1.定義支付策略接口
策略模式的第一步是定義一個接口,抽象出所有支付方式的共同行為。
/*** 支付策略接口,所有支付方式必須實現該接口。*/
public interface PaymentStrategy {/*** 執行支付操作* @param amount 支付金額*/void pay(double amount);
}
2.實現具體的支付策略類
每個支付方式對應一個實現類,獨立封裝具體的支付邏輯。
/*** 支付寶支付策略*/
public class AlipayStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用支付寶支付了 " + amount + " 元");}
}/*** 微信支付策略*/
public class WeChatPayStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用微信支付了 " + amount + " 元");}
}/*** 銀聯支付策略*/
public class UnionPayStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用銀聯支付了 " + amount + " 元");}
}
3.定義支付上下文類
上下文類負責持有具體的策略對象,并在需要時調用對應的支付邏輯。
/*** 支付上下文類,用于管理支付策略*/
public class PaymentContext {// 策略對象private PaymentStrategy paymentStrategy;/*** 構造方法,初始化支付策略*/public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}/*** 執行支付操作* @param amount 支付金額*/public void executePayment(double amount) {paymentStrategy.pay(amount);}
}
4.客戶端代碼:選擇支付方式并支付
客戶端通過選擇不同的策略,實現不同的支付方式。
/*** 客戶端測試代碼*/
public class Client {public static void main(String[] args) {double amount = 200.0; // 支付金額// 使用支付寶支付PaymentContext context = new PaymentContext(new AlipayStrategy());context.executePayment(amount);// 使用微信支付context = new PaymentContext(new WeChatPayStrategy());context.executePayment(amount);// 使用銀聯支付context = new PaymentContext(new UnionPayStrategy());context.executePayment(amount);}
}
運行結果:
使用支付寶支付了 200.0 元
使用微信支付了 200.0 元
使用銀聯支付了 200.0 元
代碼結構說明
1.策略接口PaymentStrategy
定義支付方法pay(),所有支付類須實現它。
2.具體策略類
AlipayStrategy:實現支付寶支付邏輯。
WeChatPayStrategy:微信支付邏輯。
UnionPayStrategy:實現銀聯支付邏輯。
3.上下文類PaymentContext
維護一個策略對象,客戶端可以動態選擇不同的支付策略。
4.客戶端
通過創建不同的支付策略對象,實現靈活的支付功能。
三、策略模式的價值
1.簡化主邏輯,消除復雜條件判斷
策略模式將復雜的if-else或switch-case語句分解為獨立的策略類,使主邏輯更專注于調用流程(上下文),代碼清晰且易維護。
2.便于擴展,符合開閉原則
新增功能(如支付方式)時,只需新增策略類,無需修改現有代碼,既減少對穩定模塊的干擾,也降低擴展成本。
3.提升復用性
策略類通過模塊化設計,將具體邏輯與選擇邏輯分離,可直接復用于其他系統。
四、適用場景
1.動態行為選擇
系統需要在運行時根據不同條件選擇不同的行為或算法,例如支付方式切換、促銷規則變化、日志格式化樣式調整等。
2.簡化條件分支
當代碼中存在大量if-else或switch-case時,且未來可能增加判斷分支時,可通過策略模式優化為獨立的策略類,提升可維護性。
3.高擴展性需求
系統需要頻繁新增功能,但不希望頻繁修改現有代碼,策略模式符合開閉原則(OCP)。
4.測試驅動開發場景
需要對不同行為進行獨立驗證時,策略模式將這些行為解耦,便于單獨測試。
五、總結
策略模式通過將行為或算法封裝為獨立類,結合上下文動態選擇策略,提升了系統的靈活性、擴展性與可維護性。
核心價值
? 開發上,簡化主邏輯,消除復雜條件判斷,增強擴展性與復用性。
? 測試上,降低模塊間耦合性,簡化單元測試,降低回歸測試成本。
1.策略類過多可能導致類數量膨脹,應合理設計。
2.在簡單場景下,策略模式可能顯得“過度設計”,需權衡實際需求。