介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。策略模式定义了一系列的算法,将每一个算法封装起来,并使它们可以互换。这种模式使得算法的变化不会影响到使用算法的客户端。
策略模式特别适用于以下场景:
- 算法的选择依赖于上下文:当一个对象的行为依赖于它的算法时,可以使用策略模式。
- 多个算法的替换:如果有多个相似的算法,需要在运行时选择其一,策略模式提供了一个统一的接口来访问这些算法。
- 算法的独立性:当你希望将算法与使用算法的代码分开,使得算法的变更不会影响到客户端代码。
示例背景
假设我们在开发一个支付系统,系统需要支持多种支付方式,如信用卡、PayPal 和银行转账。我们希望能够在运行时选择支付方式,而不需要修改支付处理的代码。策略模式可以帮助我们实现这一需求。
实现步骤
1. 定义策略接口(Strategy)
首先,我们定义一个支付策略接口 PaymentStrategy
,它包含一个用于处理支付的方法。
// PaymentStrategy.java
public interface PaymentStrategy {
void pay(int amount);
}
2. 实现具体策略(Concrete Strategy)
然后,我们实现多个具体策略,每一个策略代表一种支付方式。例如,信用卡支付策略和 PayPal 支付策略。
// CreditCardPayment.java
public class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
private String cardHolderName;
public CreditCardPayment(String cardNumber, String cardHolderName) {
this.cardNumber = cardNumber;
this.cardHolderName = cardHolderName;
}
@Override
public void pay(int amount) {
System.out.println("Paying " + amount + " using Credit Card.");
// 实际信用卡支付逻辑
}
}
// PayPalPayment.java
public class PayPalPayment implements PaymentStrategy {
private String email;
public PayPalPayment(String email) {
this.email = email;
}
@Override
public void pay(int amount) {
System.out.println("Paying " + amount + " using PayPal.");
// 实际 PayPal 支付逻辑
}
}
3. 创建上下文类(Context)
上下文类 PaymentContext
用于维护对策略的引用,并在需要时调用策略的方法。
// PaymentContext.java
public class PaymentContext {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void pay(int amount) {
paymentStrategy.pay(amount);
}
}
4. 使用策略模式
我们可以创建不同的支付策略实例,并在运行时选择适当的策略来处理支付。
// Main.java
public class Main {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 使用信用卡支付
PaymentStrategy creditCardPayment = new CreditCardPayment("1234-5678-9876-5432", "John Doe");
context.setPaymentStrategy(creditCardPayment);
context.pay(100); // Output: Paying 100 using Credit Card.
// 使用 PayPal 支付
PaymentStrategy paypalPayment = new PayPalPayment("john.doe@example.com");
context.setPaymentStrategy(paypalPayment);
context.pay(200); // Output: Paying 200 using PayPal.
}
}
总结
策略模式通过将算法封装在策略对象中,提供了在运行时选择不同算法的能力。这种模式将算法的实现细节与使用算法的代码分开,使得客户端可以在不修改现有代码的情况下增加新的算法或修改现有算法。在支付系统的例子中,策略模式使我们能够灵活地选择支付方式,并确保支付逻辑的清晰和可维护。