Skip to content

策略模式

字数: 0 字 时长: 0 分钟

简介

策略模式(Strategy Pattern)的核心思想是:定义一系列算法,把它们一个个封装起来,并且使他们可以相互替换。我们可以把不同的处理逻辑封装为不同的策略对象,程序运行时,根据实际情况选择合适的策略进行处理,而不需要在代码里堆砌大量的 if else

UML 类图

strategy.webp

  • 策略接口(Strategy):定义所有支持的策略算法接口。
  • 具体策略(ConcreteStrategy):实现了策略接口,定义了具体的算法。
  • 上下文(Context):持有一个策略接口的引用,负责在根据不同情况执行具体的策略。

实现示例

以“电商折扣计算”为例子,要求支持三种折扣方式:满减、打折、会员折扣。

java
// 1. 策略接口
interface DiscountStrategy {
    double calculate(double originalPrice);
}

// 2. 具体策略
class FullReductionStrategy implements DiscountStrategy {
    @Override
    public double calculate(double originalPrice) {
        if (originalPrice >= 200) {
            return originalPrice - 50; // 满减
        }
    }
}
class PercentageStrategy implements DiscountStrategy {
    @Override
    public double calculate(double originalPrice) {
        return originalPrice * 0.8; // 8折优惠
    }
}
class VipDiscountStrategy implements DiscountStrategy {
    @Override
    public double calculate(double originalPrice) {
        return originalPrice * 0.7; // VIP 7折优惠
    }
}

// 3. 上下文
class PriceCalculator {
    private DiscountStrategy strategy;
    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }
    public double calculate(double originalPrice) {
        if (strategy == null) {
            throw new IllegalStateException("未设置折扣策略");
        }
        return strategy.calculate(originalPrice);
    }
}

// 4. 调用示例
public static void main(String[] args) {
    PriceCalculator calculator = new PriceCalculator();
    double originalPrice = 100;
    // 满减策略
    calculator.setStrategy(new FullReductionStrategy());
    // 打折策略
    calculator.setStrategy(new PercentageStrategy());
}