Java 行为型模式:策略模式的接口和方法

策略模式是一种行为型设计模式,它允许在运行时选择算法的策略。通过定义一系列的算法,将它们封装在介于间并使它们可以互换,策略模式使得算法的变化不会影响到使用算法的客户。

策略模式的角色

策略模式主要由以下几种角色组成:

  1. 环境角色(Context):持有对策略类的引用,定义客户端与策略类之间的交互。
  2. 抽象策略角色(Strategy):定义公共接口,所有具体策略必须实现这个接口。
  3. 具体策略角色(ConcreteStrategy):实现抽象策略接口,封装具体的算法或行为。

通过这种格式,我们可以将策略独立于使用它的上下文进行变化,实现算法的动态切换。

示例:购物折扣策略

下面是一个简单的购物折扣策略的例子:

1. 抽象策略角色

// 定义折扣策略接口
public interface DiscountStrategy {
    double applyDiscount(double price);
}

2. 具体策略角色

// 具体策略:无折扣
public class NoDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price;
    }
}

// 具体策略:打9折
public class TenPercentDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price * 0.9;
    }
}

// 具体策略:满200减50
public class FiftyOffDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price >= 200 ? price - 50 : price;
    }
}

3. 环境角色

// 环境类:购物车
public class ShoppingCart {
    private DiscountStrategy discountStrategy;

    public ShoppingCart(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double checkOut(double price) {
        return discountStrategy.applyDiscount(price);
    }
}

4. 客户端代码

下面是如何使用这些角色的示例代码:

public class StrategyPatternDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart(new NoDiscount());
        System.out.println("总价(无折扣): " + cart.checkOut(250)); // 250.0

        cart.setDiscountStrategy(new TenPercentDiscount());
        System.out.println("总价(打9折): " + cart.checkOut(250)); // 225.0

        cart.setDiscountStrategy(new FiftyOffDiscount());
        System.out.println("总价(满200减50): " + cart.checkOut(250)); // 200.0
    }
}

时序图

为了更好地理解策略模式的执行流程,下面是一个简单的时序图,展示了购物车如何使用不同的折扣策略。

sequenceDiagram
    participant Client
    participant ShoppingCart
    participant Strategy

    Client->>ShoppingCart: 创建购物车
    ShoppingCart->>Strategy: setDiscountStrategy(NoDiscount)
    Client->>ShoppingCart: checkOut(250)
    ShoppingCart->>Strategy: applyDiscount(250)
    Strategy-->>ShoppingCart: 250
    ShoppingCart-->>Client: 总价(无折扣): 250

    Client->>ShoppingCart: setDiscountStrategy(TenPercentDiscount)
    Client->>ShoppingCart: checkOut(250)
    ShoppingCart->>Strategy: applyDiscount(250)
    Strategy-->>ShoppingCart: 225
    ShoppingCart-->>Client: 总价(打9折): 225

    Client->>ShoppingCart: setDiscountStrategy(FiftyOffDiscount)
    Client->>ShoppingCart: checkOut(250)
    ShoppingCart->>Strategy: applyDiscount(250)
    Strategy-->>ShoppingCart: 200
    ShoppingCart-->>Client: 总价(满200减50): 200

总结

策略模式是一种灵活且强大的设计模式,可以有效地帮助我们管理和维护多种算法或行为。通过将算法或行为抽象成策略,我们可以在不同的业务需求中自由切换而不需修改客户端代码。这种模式在许多场景下都非常有用,例如支付方式、排序算法等。

策略模式的生命力在于它的可扩展性与灵活性,我们可以很轻松地增加新的策略,而不对现有代码造成影响。希望通过这个简单的示例,能够帮助你更好地理解策略模式的应用和意义。