策略模式通过将条件分支抽为独立函数并用对象映射、工厂或类封装来解耦逻辑,提升可读性、可维护性与可测试性,支持动态切换与默认兜底。

JavaScript 中的多重 if-else 或 switch 分支,本质是把“不同条件对应不同行为”的逻辑硬编码在控制流里。随着业务变复杂,这种写法很快变得难读、难改、难测。策略模式不改变逻辑,而是把每个分支抽成独立可插拔的函数,用对象映射或类封装来组织,让流程控制从“写死的判断”变成“按需调用”。
用对象字面量做策略映射
这是最轻量、最符合 JS 特性的做法。把每种条件场景作为 key,对应执行函数作为 value:
- 定义一个策略对象,每个属性是一个纯函数,只负责一种计算或行为
- 上下文函数(比如 calculateDiscount)只做两件事:查策略、执行策略
- 新增类型时,只需往对象里加一个新键值对,不用动任何 if 或 switch
例如会员折扣逻辑:
const strategies = { normal: p => p, vip: p => p * 0.85, svip: p => p * 0.75, annual: p => p * 0.8 };
调用时直接 strategies[type]?.(price) ?? price,清晰又安全。
用函数工厂统一构造策略
当多个策略逻辑高度相似(比如都是打折,只是系数不同),可以避免重复代码:
立即学习“Java免费学习笔记(深入)”;
- 写一个工厂函数,接收折扣率、满减门槛等参数,返回具体策略函数
- 所有策略由同一份模板生成,保证结构一致、易于维护
- 比如 createDiscountStrategy(rate, minAmount = 0, bonus = 0) 可产出 VIP、SVIP、节日特惠等策略
用类封装策略并支持运行时切换
适合需要状态管理或复杂生命周期的场景,比如支付方式策略(微信、支付宝、银行卡)可能各自持有 token、回调地址、验签逻辑:
- 每个策略实现统一接口方法(如 pay(amount)、validate())
- 上下文类(Context)持有一个策略实例引用,通过 setter 动态替换
- 测试时可轻松注入 mock 策略,解耦依赖
默认策略与兜底机制
真实业务中总有未覆盖的 case,硬抛错不如优雅降级:
- 策略对象里预留 DEFAULT 属性,指向安全兜底函数
- 调用前用逻辑运算符或空值合并操作符(??)自动 fallback:strategies[user.type] ?? strategies.DEFAULT
- 避免因未知类型导致整个流程中断,也减少防御性判断嵌套


















