设计模式之策略模式

介绍

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,将每一个算法封装起来,并使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。这种模式是一种对象行为模式,用于定义一系列算法,并将每一种算法封装和使它们可相互替换。

策略模式主要包含三种角色:

  1. Context(上下文):维护对策略对象的引用,并提供一个接口供客户端设置具体策略或执行策略。
  2. Strategy(策略接口):定义所有支持的算法的公共接口。Context 使用这个接口来调用某个 ConcreteStrategy 定义的算法。
  3. ConcreteStrategy(具体策略):实现 Strategy 接口中定义的算法。

示例代码

假设有一个简单的支付系统,需要根据不同的支付方式(如信用卡支付、PayPal 支付等)执行不同的支付策略。以下是基于 Java 的策略模式实现:

// Strategy Interface
public interface PaymentStrategy {
    void pay(int amount);
}

// ConcreteStrategy 1
public class CreditCardPaymentStrategy implements PaymentStrategy {
    private String name;
    private String cardNumber;

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

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid with credit card.");
    }
}

// ConcreteStrategy 2
public class PayPalPaymentStrategy implements PaymentStrategy {
    private String emailId;

    public PayPalPaymentStrategy(String email) {
        this.emailId = email;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using PayPal.");
    }
}

// Context
public class ShoppingCart {
    private List items;
    private PaymentStrategy paymentStrategy;

    public ShoppingCart() {
        this.items = new ArrayList<>();
    }

    public void addItem(Item item) {
        this.items.add(item);
    }

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

    public void checkout() {
        // Calculate total amount
        int amount = items.stream().mapToInt(Item::getPrice).sum();
        paymentStrategy.pay(amount);
    }
}

// Usage
public class StrategyPatternDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        cart.addItem(new Item("1234", 10));
        cart.addItem(new Item("5678", 40));

        // Setting the payment strategy to PayPal
        cart.setPaymentStrategy(new PayPalPaymentStrategy("[email protected]"));
        cart.checkout();

        // Changing the payment strategy to Credit Card
        cart.setPaymentStrategy(new CreditCardPaymentStrategy("John Doe", "1234567890123456"));
        cart.checkout();
    }
}

在这个例子中,PaymentStrategy 是策略接口,CreditCardPaymentStrategyPayPalPaymentStrategy 是具体策略类,ShoppingCart 是上下文,它使用一个 PaymentStrategy 来定义结账时的支付方式。StrategyPatternDemo 类展示了如何使用这些类,包括如何在运行时改变支付策略。

你可能感兴趣的:(设计模式,策略模式)