策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个对象,并使它们可以相互替换。策略模式允许客户端在运行时选择算法,而不必修改代码。

结构

  • 策略接口(Strategy): 定义了一系列算法的接口,所有具体策略类都要实现这个接口。
public interface Strategy {
    void performAction();
}
  • 具体策略类(Concrete Strategies): 实现了策略接口,定义了具体的算法。
public class ConcreteStrategyA implements Strategy {
    public void performAction() {
        System.out.println("Using Strategy A");
    }
}

public class ConcreteStrategyB implements Strategy {
    public void performAction() {
        System.out.println("Using Strategy B");
    }
}
  • 环境类(Context): 包含一个策略对象,维护一个引用指向策略对象,可以根据客户端的需求切换策略。
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void execute() {
        strategy.performAction();
    }
}

优点和缺点

优点:

  1. 灵活性: 策略模式允许在运行时动态切换算法,提供了更大的灵活性。
  2. 可维护性: 每个具体策略类都有自己的单独实现,易于维护和扩展。
  3. 减少条件语句: 策略模式可以减少大量的条件语句,使代码更加清晰和易于理解。
  4. 提高可测试性: 客户端可以使用不同的策略对象进行单元测试,便于测试和验证各个算法的正确性。

缺点:

  1. 增加类的数量: 策略模式引入了多个具体策略类,可能会增加类的数量,使得系统更加庞大。
  2. 客户端需要了解不同策略: 客户端需要了解不同策略的特点,选择合适的策略,可能增加了客户端的复杂性。

示例

以下是一个策略模式的示例,模拟不同的支付方式,包括信用卡支付和支付宝支付。在这个示例中,PaymentStrategy 是策略接口,CreditCardPayment 和 AlipayPayment 是具体策略类,ShoppingCart 是环境类。

// 策略接口
public interface PaymentStrategy {
    void pay(int amount);
}

// 具体策略类 - 信用卡支付
public class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;

    public CreditCardPayment(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    public void pay(int amount) {
        System.out.println("Paid " + amount + " dollars with Credit Card (" + cardNumber + ")");
    }
}

// 具体策略类 - 支付宝支付
public class AlipayPayment implements PaymentStrategy {
    private String account;

    public AlipayPayment(String account) {
        this.account = account;
    }

    public void pay(int amount) {
        System.out.println("Paid " + amount + " dollars with Alipay (" + account + ")");
    }
}

// 环境类
public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

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

    public void checkout(int amount) {
        paymentStrategy.pay(amount);
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        PaymentStrategy creditCardPayment = new CreditCardPayment("1234-5678-9012-3456");
        cart.setPaymentStrategy(creditCardPayment);
        cart.checkout(100);

        PaymentStrategy alipayPayment = new AlipayPayment("example@example.com");
        cart.setPaymentStrategy(alipayPayment);
        cart.checkout(200);
    }
}

在这个示例中,PaymentStrategy 接口定义了支付策略,CreditCardPayment 和 AlipayPayment 是具体的支付策略类。ShoppingCart 是环境类,它可以根据客户端的选择来切换不同的支付策略。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注