一、概述

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的策略类,使得它们可以相互替换,而不影响使用算法的客户端。这样可以使客户端代码与具体算法的实现细节解耦,提高了代码的可维护性和扩展性。

在策略模式中,有三个主要角色:

  • 环境(Context):它持有一个策略对象,并在运行时调用策略对象的方法。
  • 抽象策略(Strategy):它定义了一个公共接口,用于封装不同的算法或行为。
  • 具体策略(Concrete Strategy):它实现了抽象策略接口,提供具体的算法或行为实现。

二、代码

下面是一个简单的策略模式的代码示例:

//1.抽象策略接口,支付策略
public interface PaymentStrategy {
    void pay(double amount);
}
//2.具体策略实现类,信用卡支付策略
public class CreditCardStrategy implements PaymentStrategy {
    private String name;
    private String cardNumber;
    private String cvv;

    public CreditCardStrategy(String name, String cardNumber, String cvv) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvv = cvv;
    }

    public void pay(double amount) {
        System.out.println("Paying $" + amount + " with credit card: " + cardNumber);
    }
}
//3.具体策略实现类,PayPal支付策略
public class PayPalStrategy implements PaymentStrategy {
    private String email;
    private String password;

    public PayPalStrategy(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public void pay(double amount) {
        System.out.println("Paying $" + amount + " with PayPal account: " + email);
    }
}
//4.策略环境类,购物车
public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(double amount) {
        paymentStrategy.pay(amount);
    }
}
//5.测试类
public class Test {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        // 使用信用卡支付
        PaymentStrategy creditCardStrategy = new CreditCardStrategy("tom", "123456789", "123");
        cart.setPaymentStrategy(creditCardStrategy);
        cart.checkout(100.0);

        // 使用PayPal支付
        PaymentStrategy payPalStrategy = new PayPalStrategy("example@example.com", "password");
        cart.setPaymentStrategy(payPalStrategy);
        cart.checkout(200.0);
    }
}

在上面的代码中,我们定义了一个抽象策略接口 PaymentStrategy,它包含了一个支付方法 pay()。然后我们实现了两个具体策略类 CreditCardStrategyPayPalStrategy,分别表示使用信用卡支付和使用PayPal支付的具体算法实现。

在环境类 ShoppingCart 中,我们通过设置不同的支付策略对象,来决定使用何种支付方式进行结算。在测试代码中,我们创建了一个购物车对象 cart,然后使用信用卡支付和PayPal支付进行结算,分别设置了相应的支付策略对象。

05-09 18:36