什么是Strategy设计模式?
Strategy模式是一种行为型设计模式,它定义了一系列算法,将每种算法封装到独立的类中,使它们可以互换。使用该模式,可以在不修改客户端代码的情况下动态地改变算法的行为。
为什么需要Strategy模式?
- 避免代码重复:在同一个类中包含多种算法会导致代码膨胀,Strategy模式通过分离不同的算法解决了这一问题。
- 提高扩展性:可以轻松地添加新的算法,而无需修改现有代码。
- 遵循开闭原则:通过封装算法,使得类对扩展开放,对修改关闭。
UML图解
下面是Strategy模式的通用UML图解:
实现示例
以下是一个简单的例子,展示如何使用Strategy模式实现不同的折扣策略。
定义策略接口
public interface DiscountStrategy {double calculateDiscount(double price);
}
实现具体策略
满减折扣策略:
public class FullReductionStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double price) {if (price > 100) {return price - 20;}return price;}
}
百分比折扣策略:
public class PercentageDiscountStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double price) {return price * 0.9;}
}
上下文类
public class ShoppingCart {private DiscountStrategy discountStrategy;public void setDiscountStrategy(DiscountStrategy discountStrategy) {this.discountStrategy = discountStrategy;}public double calculatePrice(double price) {if (discountStrategy == null) {throw new IllegalStateException("Discount strategy not set");}return discountStrategy.calculateDiscount(price);}
}
客户端代码
public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 使用满减策略cart.setDiscountStrategy(new FullReductionStrategy());System.out.println("满减后价格: " + cart.calculatePrice(120));// 使用百分比折扣策略cart.setDiscountStrategy(new PercentageDiscountStrategy());System.out.println("折扣后价格: " + cart.calculatePrice(120));}
}
流程图
以下是Strategy模式的执行流程:
优点
- 清晰的职责分离:每种算法被封装在独立的类中。
- 易于扩展:可以随时添加新的策略。
- 可维护性强:更改某种策略只需修改对应的策略类,不影响其他部分。
缺点
- 类数量增加:每种策略都需要单独的类,可能导致类的数量膨胀。
- 客户端需要理解不同的策略:客户端代码需要知道何时使用何种策略。
适用场景
- 系统需要动态地在多个算法中选择其一。
- 不同的客户需要不同的业务规则处理。
- 避免使用条件语句将多个算法硬编码在一个类中。
总结
Strategy模式是解决算法或行为动态切换的有效方法。它通过将算法抽象化,使得代码更加灵活、易于扩展,同时也减少了代码重复。如果你在开发过程中遇到了需要频繁修改或扩展算法的需求,不妨考虑使用Strategy模式。