策略模式介紹
策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一系列算法,將每個算法封裝起來并使它們可相互替換。策略模式讓算法的變化獨立于使用算法的客戶端,從而實現靈活的算法切換。
核心角色:
- ??環境類(Context):持有策略接口的引用,負責調用具體策略
- ??策略接口(Strategy):定義所有支持的算法的公共接口
- ??具體策略類(ConcreteStrategy):實現策略接口,提供具體算法實現
Java代碼實現示例
下面通過一個"支付方式選擇"的場景來演示策略模式:
//?策略接口:定義支付算法的公共接口
public?interface?PaymentStrategy?{void?pay(double?amount);
}//?具體策略類:PayPal支付
public?class?PayPalPayment?implements?PaymentStrategy?{private?String?emailId;private?String?password;public?PayPalPayment(String?emailId,?String?password)?{this.emailId?=?emailId;this.password?=?password;}@Overridepublic?void?pay(double?amount)?{System.out.println(amount?+?"?元用PayPal支付。");//?實際應用中會有驗證PayPal賬號、連接PayPal接口等邏輯}
}//?具體策略類:信用卡支付
public?class?CreditCardPayment?implements?PaymentStrategy?{private?String?name;private?String?cardNumber;private?String?cvv;private?String?expiryDate;public?CreditCardPayment(String?name,?String?cardNumber,?String?cvv,?String?expiryDate)?{this.name?=?name;this.cardNumber?=?cardNumber;this.cvv?=?cvv;this.expiryDate?=?expiryDate;}@Overridepublic?void?pay(double?amount)?{System.out.println(amount?+?"?元用信用卡支付。");//?實際應用中會有驗證信用卡信息、連接支付網關等邏輯}
}//?環境類:購物車,使用支付策略
public?class?ShoppingCart?{private?PaymentStrategy?paymentStrategy;//?設置支付策略public?void?setPaymentStrategy(PaymentStrategy?paymentStrategy)?{this.paymentStrategy?=?paymentStrategy;}//?結算public?void?checkout(double?amount)?{if?(paymentStrategy?==?null)?{throw?new?IllegalStateException("請先設置支付方式");}paymentStrategy.pay(amount);}
}//?客戶端代碼
public?class?Main?{public?static?void?main(String[]?args)?{ShoppingCart?cart?=?new?ShoppingCart();//?選擇信用卡支付PaymentStrategy?creditCardPayment?=?new?CreditCardPayment("張三",?"1234-5678-9012-3456",?"123",?"12/25");cart.setPaymentStrategy(creditCardPayment);cart.checkout(100.50);//?切換為PayPal支付PaymentStrategy?paypalPayment?=?new?PayPalPayment("zhangsan@example.com",?"password123");cart.setPaymentStrategy(paypalPayment);cart.checkout(200.75);}
}
代碼解釋
- 1.?策略接口(PaymentStrategy):
- ? 定義了所有支付方式的統一接口
pay(double amount)
- ? 確保所有支付方式都遵循相同的調用規范
- ? 定義了所有支付方式的統一接口
- 2.?具體策略類:
- ??
CreditCardPayment
:實現信用卡支付的具體邏輯 - ??
PayPalPayment
:實現PayPal支付的具體邏輯 - ? 每個策略類都封裝了自己的算法實現,相互獨立
- ??
- 3.?環境類(ShoppingCart):
- ? 持有支付策略的引用,通過
setPaymentStrategy
方法設置具體策略 - ? 提供
checkout
方法,內部調用當前策略的pay
方法完成支付 - ? 客戶端無需知道具體支付細節,只需與購物車交互
- ? 持有支付策略的引用,通過
- 4.?客戶端(Main):
- ? 創建具體的支付策略對象
- ? 通過購物車設置支付策略并完成結算
- ? 可以隨時切換不同的支付策略,無需修改購物車代碼
策略模式的優勢
- ??靈活性高:可以在運行時動態切換算法
- ??代碼復用:避免使用多重條件判斷(if-else或switch)
- ??開閉原則:新增策略只需實現接口,無需修改現有代碼
- ??責任單一:每個策略類專注于實現一種算法
適用場景:當一個系統需要多種算法,且需要動態選擇使用哪種算法時,適合使用策略模式。
更多參考資料
https://pan.baidu.com/s/1c1oQItiA7nZxz8Rnl3STpw?pwd=yftc
https://pan.quark.cn/s/dec9e4868381