1 策略模式核心思想
策略模式(Strategy Pattern)的定义十分精妙:定义一系列算法,将每个算法封装起来,并使它们可以相互替换。这种模式让算法独立于使用它的客户而变化,其核心在于将算法的使用与实现分离。
如同诸葛亮给赵云的三个锦囊,每个锦囊都封装了特定情境下的应对策略。赵云不需要理解每个策略的具体实现细节,只需根据实际情况打开相应锦囊执行策略即可。这种思想在软件设计中极具价值,让我们能够灵活应对需求变化。
2 UML结构解析
策略模式包含三个核心角色:
- Context(环境类):持有一个Strategy对象的引用,根据需要切换不同策略
- Strategy(抽象策略):定义算法接口,声明策略方法
- ConcreteStrategy(具体策略):实现Strategy接口,提供具体算法实现
这种清晰的职责分离使得系统易于扩展和维护,新增策略时只需添加新的具体策略类,无需修改现有代码。
3 实战示例:电商折扣系统
想象一个电商平台需要根据不同促销活动计算折扣:普通折扣、满减折扣和会员折扣。使用if-else判断不仅冗长且难以维护,策略模式提供了优雅解决方案。
// 抽象策略接口
public interface DiscountStrategy {
double applyDiscount(double originalPrice);
}
// 具体策略:普通折扣
public class RegularDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double originalPrice) {
return originalPrice * 0.9; // 9折
}
}
// 具体策略:满减折扣
public class FullMinusDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double originalPrice) {
if (originalPrice >= 200) {
return originalPrice - 50;
}
return originalPrice;
}
}
// 环境类
public class DiscountContext {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double executeStrategy(double price) {
return strategy.applyDiscount(price);
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
DiscountContext context = new DiscountContext();
// 使用普通折扣
context.setStrategy(new RegularDiscount());
System.out.println("普通折扣后价格: " + context.executeStrategy(300));
// 动态切换为满减折扣
context.setStrategy(new FullMinusDiscount());
System.out.println("满减折扣后价格: " + context.executeStrategy(300));
}
}
4 策略模式的优势与适用场景
优势:
- 完美符合开闭原则,无需修改上下文即可引入新策略
- 避免了冗长的条件判断语句
- 算法可以自由切换和复用
适用场景:
- 系统需要在多种算法中灵活切换
- 需要屏蔽算法具体实现细节
- 存在多重条件判断,且每个条件分支对应一个算法
策略模式与状态模式结构相似但意图不同:策略模式关注算法选择,是主动的;状态模式关注状态转换,是被动的。
5 总结与思考
策略模式通过将算法封装成独立类,实现了算法的动态切换和职责分离。它不仅能消除大量的条件判断,还提高了代码的可测试性和可维护性。在应对频繁变化的业务规则时,策略模式犹如一把利器,让我们的设计更加灵活优雅。
正如《设计模式》中所说:“策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。”掌握策略模式,正是我们迈向高质量软件设计的重要一步。
1万+






