返回首页

策略模式(面试版)

一、面试常考点

1. 策略模式解决什么问题

将可替换算法独立封装,避免大量 if-else/switch

2. 核心结构

策略(算法实现)+ 上下文(策略选择与执行)。

3. 面试追问点

如何新增策略、如何做默认策略和兜底策略。

二、细节介绍

1. 核心思想

“算法可替换”,调用方不关心算法细节,只关心输入输出契约。

2. 优点

扩展性强、条件分支少、测试更聚焦。

3. 代价

策略数量多时需要治理命名和注册机制。

三、示例代码

const discountStrategies = {
  NORMAL: (price) => price,
  VIP: (price) => price * 0.9,
  SUPER_VIP: (price) => price * 0.8,
}

class PriceContext {
  constructor(strategyMap) {
    this.strategyMap = strategyMap
  }

  calc(level, price) {
    const strategy = this.strategyMap[level] || this.strategyMap.NORMAL
    return Number(strategy(price).toFixed(2))
  }
}

const ctx = new PriceContext(discountStrategies)
console.log(ctx.calc('VIP', 100)) // 90

四、常用应用场景

1. 营销优惠

按会员等级、活动类型切换折扣算法。

2. 表单校验

按字段类型选择不同校验规则。

3. 文件上传策略

按文件大小/网络环境切换直传、分片、断点续传方案。

五、高频追问标准答法(Q/A)

1. Q: 策略模式和 if-else 本质差异

A: if-else 把选择和实现耦合在一起;策略模式把算法拆分为可替换单元。

2. Q: 策略多了如何治理

A: 用统一注册表、命名规范、默认策略和兜底策略,配合单测保障行为一致。

3. Q: 策略模式适合哪些信号

A: 业务分支持续增长、同一输入输出有多套算法、频繁新增规则。