策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端,这种模式的主要优点是可以在运行时动态选择算法,从而使算法的变化更加灵活。
策略模式的主要角色包括:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略的具体算法。
3、上下文(Context):持有一个策略类的引用,需要在运行时知道具体使用哪个策略。
下面我们通过一个简单的例子来说明策略模式的使用。
假设我们有一个电商系统,需要根据不同的促销活动计算折扣,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略,即促销活动的算法:
public interface DiscountStrategy { double getDiscount(double originalPrice); }
我们可以实现具体的促销活动算法:
public class NoDiscountStrategy implements DiscountStrategy { @Override public double getDiscount(double originalPrice) { return originalPrice; } } public class HalfPriceDiscountStrategy implements DiscountStrategy { @Override public double getDiscount(double originalPrice) { return originalPrice * 0.5; } }
我们需要定义一个上下文,用于在运行时选择具体的策略:
public class DiscountContext { private DiscountStrategy strategy; public DiscountContext(DiscountStrategy strategy) { this.strategy = strategy; } public void setStrategy(DiscountStrategy strategy) { this.strategy = strategy; } public double calculateDiscountedPrice(double originalPrice) { return strategy.getDiscount(originalPrice); } }
我们可以在客户端代码中使用策略模式来计算折扣:
public class Main { public static void main(String[] args) { DiscountContext context = new DiscountContext(new NoDiscountStrategy()); // 不打折的情况 System.out.println("原价:100元,不打折后的价格为:" + context.calculateDiscountedPrice(100)); // 输出:原价:100元,不打折后的价格为:100.0 context.setStrategy(new HalfPriceDiscountStrategy()); // 按半价打折的情况 System.out.println("原价:100元,按半价打折后的价格为:" + context.calculateDiscountedPrice(100)); // 输出:原价:100元,按半价打折后的价格为:50.0 } }
通过策略模式,我们可以在不修改客户端代码的情况下,轻松地切换不同的促销活动算法,这使得我们的电商系统更加灵活和可扩展。