JavaScript中策略模式不依赖继承派生,而是通过组合实现算法封装与动态切换;可用抽象基类约束策略接口,或直接用函数式策略更简洁自然。

JavaScript 中没有原生的“策略模式派生”概念,策略模式本身是行为型设计模式,关注的是**算法的封装与动态切换**,不涉及类的继承派生关系。但你可以用 JavaScript 的继承机制(如 ES6 class + extends 或原型链)来组织策略类,实现策略的可扩展性与复用性。关键不是“用继承派生策略”,而是“用继承来构建可维护的策略族”。
策略接口统一:用基类定义契约
为避免策略实现散乱、调用方式不一致,可定义一个抽象策略基类(或仅作文档契约),强制子类实现核心方法(如 execute())。JavaScript 没有真正的抽象类,但可通过抛错模拟约束:
class Strategy {
execute(...args) {
throw new Error('Strategy.execute() must be implemented');
}
}
class PaymentStrategy extends Strategy {
execute(amount) {
console.log(`Processing $${amount} via ${this.constructor.name}`);
}
}
class CreditCardStrategy extends PaymentStrategy {
execute(amount) {
console.log(`Charging $${amount} to credit card`);
}
}
class PayPalStrategy extends PaymentStrategy {
execute(amount) {
console.log(`Paying $${amount} via PayPal`);
}
}
策略上下文解耦:运行时注入,不依赖继承链
策略模式的核心是“组合优于继承”。上下文(Context)应持有策略实例,而非继承它。继承用于策略内部横向扩展(如不同支付方式),而非上下文与策略之间:
- Context 不继承 Strategy,而是接收 Strategy 实例作为参数
- 允许运行时切换策略,比如根据用户选择切换
CreditCardStrategy或PayPalStrategy - 避免把业务逻辑耦合进继承层级,保持 Context 简洁
实际使用示例:带策略切换的订单处理器
以下是一个轻量、可运行的整合示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
class OrderProcessor {
constructor(strategy) {
this.strategy = strategy;
}
setStrategy(strategy) {
this.strategy = strategy;
}
process(amount) {
this.strategy.execute(amount);
}
}
// 使用
const processor = new OrderProcessor(new CreditCardStrategy());
processor.process(99.99); // Charging $99.99 to credit card
processor.setStrategy(new PayPalStrategy());
processor.process(45.50); // Paying $45.50 via PayPal
替代方案:函数式策略更符合 JS 习惯
JavaScript 天然支持高阶函数。比起继承,直接用纯函数定义策略往往更简洁、易测试、无冗余类:
- 每个策略是一个独立函数:
const creditCard = (amt) => console.log(...) - Context 接收函数而非实例:
constructor(executeFn) - 省去类声明和继承开销,策略即值,可自由组合、柯里化、缓存
不复杂但容易忽略:策略模式的价值不在“怎么写类”,而在于明确分离变化点(算法)与稳定点(上下文),让新增策略无需修改原有代码。用继承组织策略族可以提升类型提示和 IDE 支持,但不是必须;函数式写法在 JS 中通常更自然、更灵活。

















