掌握設(shè)計模式--策略模式
策略模式(Strategy Pattern)
策略模式是一種行為設(shè)計模式,它定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換,從而讓算法的變化獨立于使用它們的客戶端代碼。
策略模式的核心在于為算法的實現(xiàn)提供統(tǒng)一的接口,并通過動態(tài)選擇具體實現(xiàn)來實現(xiàn)靈活性。
組成部分
-
Context(上下文類):
持有對某個策略對象的引用,并定義客戶端需要的接口,負(fù)責(zé)在運行時動態(tài)切換策略。 -
Strategy(策略接口):
定義所有支持的算法的公共接口。 -
ConcreteStrategy(具體策略實現(xiàn)):
實現(xiàn)Strategy接口的具體算法。
代碼示例
以下是使用策略模式實現(xiàn)不同的支付方式的動態(tài)切換。信用卡支付和微信支付的動態(tài)切換。
類圖

策略接口
// 策略接口
public interface PaymentStrategy {
void pay(int amount);
}
具體策略實現(xiàn)
// 具體策略實現(xiàn) - 信用卡支付
public class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
public CreditCardPayment(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println("交易金額 " + amount + " 使用的卡號: " + cardNumber);
}
}
// 具體策略實現(xiàn) - 微信支付
public class WxPayment implements PaymentStrategy {
private String phoneNumber;
public WxPayment(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public void pay(int amount) {
System.out.println("交易金額 " + amount + " 使用的手機號: " + phoneNumber);
}
}
上下文
// 上下文類
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(int amount) {
strategy.pay(amount);
}
}
測試代碼
public class StrategyPatternDemo {
public static void main(String[] args) {
// 使用信用卡支付
PaymentContext context = new PaymentContext(new CreditCardPayment("1234-5678-9012-3456"));
context.executePayment(100);
// 切換到Wx支付
context.setStrategy(new WxPayment("13112345678"));
context.executePayment(200);
}
}
測試結(jié)果
交易金額 100 使用的卡號: 1234-5678-9012-3456
交易金額 200 使用的手機號: 13112345678
優(yōu)缺點和適用場景
優(yōu)點
-
開放-封閉原則: 新的策略可以在不修改現(xiàn)有代碼的情況下添加。
-
提高代碼靈活性: 可以動態(tài)地在運行時選擇算法。
-
消除冗長的條件分支: 使用策略模式代替
if-else或switch-case條件判斷。
缺點
-
類的數(shù)量增加: 每個策略需要定義一個類,可能導(dǎo)致類數(shù)量增多。
-
客戶端需要知道所有策略: 客戶端必須了解策略的作用并選擇合適的策略。
適用場景
- 多個算法只有在行為上稍有不同的情況下。
- 需要動態(tài)選擇算法或者行為的情況下。
- 避免使用條件語句(
if-else或switch-case)來管理算法時。
實際應(yīng)用
- 數(shù)據(jù)加密算法選擇(AES、RSA等)
- 數(shù)據(jù)壓縮算法(ZIP、GZIP)
- 不同類型的文件解析(JSON、XML、YAML)
策略模式與其他模式的對比
-
狀態(tài)模式: 狀態(tài)模式的行為是狀態(tài)驅(qū)動的,而策略模式的行為是由客戶端選擇驅(qū)動的。
-
工廠模式: 工廠模式用于創(chuàng)建對象,而策略模式關(guān)注的是行為的動態(tài)切換。
-
橋接模式: 橋接模式側(cè)重于分離抽象和實現(xiàn)及多維度的擴(kuò)展;而策略模式用于封裝算法或行為,單維度的擴(kuò)展。
-
裝飾模式: 使用一系列裝飾器類,通過組合的方式增強對象的功能。裝飾器的核心在于“增強”。
-
策略模式: 客戶端在運行時選擇合適的策略來完成特定任務(wù)。策略模式的核心在于“替換”。
總結(jié)
策略設(shè)計模式定義了一系列算法(策略),將每個算法封裝到獨立的策略類中,并通過上下文類動態(tài)地選擇和使用不同的策略,從而讓算法的變化獨立于使用算法的客戶端。

需要查看往期設(shè)計模式文章的,可以在個人主頁中或者文章開頭的集合中查看,可關(guān)注我,持續(xù)更新中。。。

浙公網(wǎng)安備 33010602011771號