# 什么是策略模式?一般用在什么场景?
6 min read
Table of Contents
什么是策略模式?一般用在什么场景?
策略模式面试标准答案
【核心定义】
策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以相互替换,让算法的变化独立于使用算法的客户端。
【关键要点】
- 核心思想:将算法与使用环境解耦,通过组合而非继承的方式实现行为的动态切换
- 三大组件:
- Context(上下文):持有策略对象的引用,负责调用具体策略
- Strategy(策略接口):定义所有支持算法的公共接口
- ConcreteStrategy(具体策略):实现策略接口的具体算法类
- 设计原则:遵循开闭原则(对扩展开放,对修改封闭)和单一职责原则
【深度推导/细节】
策略模式的核心优势
- 消除条件语句:传统if-else/switch-case分支逻辑被替换为策略对象,代码更清晰
- 运行时动态切换:可以在程序运行时根据需要更换算法策略
- 易于测试:每个策略可以独立测试,符合单元测试的最佳实践
实现机制拆解
// Step 1: 定义策略接口public interface PaymentStrategy { void pay(double amount);}
// Step 2: 实现具体策略public class CreditCardStrategy implements PaymentStrategy { public void pay(double amount) { /* 信用卡支付逻辑 */ }}
public class PayPalStrategy implements PaymentStrategy { public void pay(double amount) { /* PayPal支付逻辑 */ }}
// Step 3: 上下文类使用策略public class ShoppingCart { private PaymentStrategy strategy;
public void setPaymentStrategy(PaymentStrategy strategy) { this.strategy = strategy; }
public void checkout(double amount) { strategy.pay(amount); }}【关联/对比】
策略模式 vs 工厂模式
- 策略模式:关注行为的可替换性,客户端知道选择哪个策略
- 工厂模式:关注对象的创建过程,客户端不关心具体实现
策略模式 vs 状态模式
- 策略模式:策略之间相互独立,客户端主动选择策略
- 状态模式:状态之间有关联,状态转换由上下文或状态自身控制
【典型应用场景】
- 支付系统:多种支付方式(信用卡、支付宝、微信支付等)
- 排序算法:根据数据特征选择不同排序策略(快速排序、归并排序等)
- 数据压缩:根据需求选择不同压缩算法(ZIP、RAR、7z等)
- 导航系统:不同路线策略(最短路径、避开高速、最少收费等)
- 游戏AI:不同难度级别的AI策略
『面试官追问』
-
策略模式和模板方法模式有什么区别?
- 策略模式:通过组合实现算法替换,运行时动态选择
- 模板方法模式:通过继承定义算法骨架,子类实现具体步骤,编译时确定
-
策略模式如何避免if-else判断?
- 使用Map或工厂模式注册策略,通过key直接获取对应策略对象
- 示例:
Map<String, Strategy> strategyMap = new HashMap<>()
-
策略模式的缺点是什么?
- 策略类数量可能过多,增加系统复杂度
- 客户端必须了解所有策略的区别
- 策略对象可能增加内存开销
-
Spring框架中哪里用到了策略模式?
- Resource接口的不同实现(ClassPathResource、FileSystemResource等)
- 不同的ViewResolver实现
- 多种事务管理策略
【最佳实践建议】
- 策略命名规范:使用
XXXStrategy后缀,提高代码可读性 - 策略注册机制:结合Spring的
@Component和Map<String, Strategy>实现自动注册 - 默认策略:提供合理的默认策略,避免客户端必须显式选择
- 策略组合:复杂场景下可以使用策略的组合,实现更灵活的行为
【版本差异与演进】
- Java 8+:可以使用函数式接口和Lambda表达式简化策略模式的实现
- Spring框架:结合
@Conditional注解实现条件化的策略选择 - 微服务架构:策略模式常用于服务路由、负载均衡等场景
回答要点总结:策略模式的核心价值在于将算法封装为独立对象,实现算法的自由切换和扩展。在实际应用中,要特别注意策略的选择机制和注册方式,避免策略类爆炸问题。结合现代框架特性,可以使策略模式的实现更加简洁高效。