策略模式
字数: 0 字 时长: 0 分钟
简介
策略模式(Strategy Pattern)的核心思想是:定义一系列算法,把它们一个个封装起来,并且使他们可以相互替换。我们可以把不同的处理逻辑封装为不同的策略对象,程序运行时,根据实际情况选择合适的策略进行处理,而不需要在代码里堆砌大量的 if else
。
UML 类图
- 策略接口(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());
}