# 什么是策略模式?一般用在什么场景?

6 min read
Table of Contents

什么是策略模式?一般用在什么场景?

策略模式面试标准答案

【核心定义】

策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以相互替换,让算法的变化独立于使用算法的客户端。

【关键要点】

  1. 核心思想:将算法与使用环境解耦,通过组合而非继承的方式实现行为的动态切换
  2. 三大组件:
    • Context(上下文):持有策略对象的引用,负责调用具体策略
    • Strategy(策略接口):定义所有支持算法的公共接口
    • ConcreteStrategy(具体策略):实现策略接口的具体算法类
  3. 设计原则:遵循开闭原则(对扩展开放,对修改封闭)和单一职责原则

【深度推导/细节】

策略模式的核心优势

  • 消除条件语句:传统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 状态模式

  • 策略模式:策略之间相互独立,客户端主动选择策略
  • 状态模式:状态之间有关联,状态转换由上下文或状态自身控制

【典型应用场景】

  1. 支付系统:多种支付方式(信用卡、支付宝、微信支付等)
  2. 排序算法:根据数据特征选择不同排序策略(快速排序、归并排序等)
  3. 数据压缩:根据需求选择不同压缩算法(ZIP、RAR、7z等)
  4. 导航系统:不同路线策略(最短路径、避开高速、最少收费等)
  5. 游戏AI:不同难度级别的AI策略

『面试官追问』

  1. 策略模式和模板方法模式有什么区别?

    • 策略模式:通过组合实现算法替换,运行时动态选择
    • 模板方法模式:通过继承定义算法骨架,子类实现具体步骤,编译时确定
  2. 策略模式如何避免if-else判断?

    • 使用Map或工厂模式注册策略,通过key直接获取对应策略对象
    • 示例:Map<String, Strategy> strategyMap = new HashMap<>()
  3. 策略模式的缺点是什么?

    • 策略类数量可能过多,增加系统复杂度
    • 客户端必须了解所有策略的区别
    • 策略对象可能增加内存开销
  4. Spring框架中哪里用到了策略模式?

    • Resource接口的不同实现(ClassPathResource、FileSystemResource等)
    • 不同的ViewResolver实现
    • 多种事务管理策略

【最佳实践建议】

  1. 策略命名规范:使用XXXStrategy后缀,提高代码可读性
  2. 策略注册机制:结合Spring的@Component和Map<String, Strategy>实现自动注册
  3. 默认策略:提供合理的默认策略,避免客户端必须显式选择
  4. 策略组合:复杂场景下可以使用策略的组合,实现更灵活的行为

【版本差异与演进】

  • Java 8+:可以使用函数式接口和Lambda表达式简化策略模式的实现
  • Spring框架:结合@Conditional注解实现条件化的策略选择
  • 微服务架构:策略模式常用于服务路由、负载均衡等场景

回答要点总结:策略模式的核心价值在于将算法封装为独立对象,实现算法的自由切换和扩展。在实际应用中,要特别注意策略的选择机制和注册方式,避免策略类爆炸问题。结合现代框架特性,可以使策略模式的实现更加简洁高效。

My avatar

文章看完了,不打算去别的篇章转转吗?👀 感谢你的耐心阅读!如果你有问题想探讨,或者发现了文中的 Bug,请务必通过页脚的链接联系我


More Posts

# 什么是 Spring Boot?

4 min read

【核心定义】Spring Boot 是一个基于 Spring 框架的快速开发脚手架,通过约定大于配置和自动装配机制,简化了 Spring 应用的初始搭建和开发过程。

Read

Comments