策略模式是一种行为型设计模式 ,它允许在运行时选择算法的行为。这种模式定义了一系列算法,并使这些算法可以相互替换,使得算法的变化独立于使用算法的客户。
以下是策略模式的一般结构:
-
Context(上下文):负责维护一个对Strategy对象的引用,并且将客户请求委托给Strategy对象。
-
Strategy(策略):定义所有支持的算法的公共接口。通常是一个接口或者抽象类。
-
ConcreteStrategy(具体策略):实现了Strategy接口的具体算法实现。
下面是一个简单的Java示例,演示了如何使用策略模式:
java
// 1. Strategy
interface PaymentStrategy {
void pay(double amount);
}
// 2. ConcreteStrategy
class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
private String expirationDate;
private String cvv;
public CreditCardPayment(String cardNumber, String expirationDate, String cvv) {
this.cardNumber = cardNumber;
this.expirationDate = expirationDate;
this.cvv = cvv;
}
@Override
public void pay(double amount) {
System.out.println("Paid $" + amount + " using Credit Card");
}
}
class PayPalPayment implements PaymentStrategy {
private String email;
private String password;
public PayPalPayment(String email, String password) {
this.email = email;
this.password = password;
}
@Override
public void pay(double amount) {
System.out.println("Paid $" + amount + " using PayPal");
}
}
// 3. Context
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(double amount) {
paymentStrategy.pay(amount);
}
}
// 4. 使用示例
public class Main {
public static void main(String[] args) {
// 创建购物车对象
ShoppingCart cart = new ShoppingCart();
// 设置支付策略为信用卡
cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012", "10/25", "123"));
// 结账
cart.checkout(100.0);
// 设置支付策略为PayPal
cart.setPaymentStrategy(new PayPalPayment("example@example.com", "password"));
// 结账
cart.checkout(200.0);
}
}
在这个示例中,PaymentStrategy是策略接口,CreditCardPayment和PayPalPayment是具体策略。ShoppingCart是上下文,它持有一个对PaymentStrategy的引用,并在结账时调用支付方法。通过更改支付策略,我们可以在不修改ShoppingCart的情况下选择不同的支付方式。