策略模式(面试版)
一、面试常考点
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: 业务分支持续增长、同一输入输出有多套算法、频繁新增规则。