Java 行为型模式:策略模式的接口和方法
策略模式是一种行为型设计模式,它允许在运行时选择算法的策略。通过定义一系列的算法,将它们封装在介于间并使它们可以互换,策略模式使得算法的变化不会影响到使用算法的客户。
策略模式的角色
策略模式主要由以下几种角色组成:
- 环境角色(Context):持有对策略类的引用,定义客户端与策略类之间的交互。
- 抽象策略角色(Strategy):定义公共接口,所有具体策略必须实现这个接口。
- 具体策略角色(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
总结
策略模式是一种灵活且强大的设计模式,可以有效地帮助我们管理和维护多种算法或行为。通过将算法或行为抽象成策略,我们可以在不同的业务需求中自由切换而不需修改客户端代码。这种模式在许多场景下都非常有用,例如支付方式、排序算法等。
策略模式的生命力在于它的可扩展性与灵活性,我们可以很轻松地增加新的策略,而不对现有代码造成影响。希望通过这个简单的示例,能够帮助你更好地理解策略模式的应用和意义。