javascript中构造函数可作为策略模式的上下文载体,持有一个可替换的策略对象(函数或类),通过统一接口(如run()或process())委托执行;策略需参数签名一致、无状态、契约统一,并支持运行时切换。

JavaScript 中构造函数本身不直接“实现”策略模式,但可以作为策略模式中 上下文(Context) 的载体,配合策略对象完成行为分发。核心思路是:构造函数创建的实例持有一个策略引用,并通过统一接口委托执行具体策略逻辑。
用构造函数封装上下文,策略对象独立定义
策略模式强调“算法可互换”,因此策略应是可替换的独立对象(函数或类),而构造函数负责持有和调用它。
- 每个策略是一个纯函数或带
execute方法的对象,接收相同参数签名 - 构造函数接受策略作为参数(或在内部根据条件选择),并保存为实例属性
- 提供一个公共方法(如
run()),内部调用当前策略的逻辑
示例:
// 策略定义(可替换)
const strategies = {
'log': (data) => console.log('LOG:', data),
'save': (data) => localStorage.setItem('last', JSON.stringify(data)),
'validate': (data) => data && typeof data === 'object'
};
// 构造函数作为上下文
function Processor(strategyName) {
this.strategy = strategies[strategyName];
if (!this.strategy) throw new Error(`Unknown strategy: ${strategyName}`);
}
Processor.prototype.run = function(data) {
return this.strategy(data);
};
// 使用
const logger = new Processor('log');
logger.run({ msg: 'hello' }); // LOG: { msg: 'hello' }
const saver = new Processor('save');
saver.run({ time: Date.now() });
支持运行时切换策略(动态分发)
构造函数实例可暴露 setStrategy 方法,让策略在生命周期内变更,真正体现“分发”的灵活性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 避免每次新建实例,复用上下文状态(如缓存、配置)
- 策略切换后,后续
run()自动使用新策略 - 适合表单提交、事件处理等需根据用户操作切换行为的场景
增强版示例:
function TaskRunner(initialStrategy) {
this.strategy = strategies[initialStrategy];
}
TaskRunner.prototype.setStrategy = function(name) {
if (strategies[name]) {
this.strategy = strategies[name];
}
};
TaskRunner.prototype.execute = function(payload) {
if (typeof this.strategy !== 'function') {
throw new Error('No valid strategy set');
}
return this.strategy(payload);
};
// 动态切换
const runner = new TaskRunner('log');
runner.execute('start'); // LOG: start
runner.setStrategy('validate');
console.log(runner.execute({})); // true
结合类语法 + 策略注入(现代写法)
ES6 类更清晰地表达意图,且便于类型提示(如 TypeScript)。策略可通过构造函数参数、setter 或工厂方法注入。
- 策略类实现统一接口(如
handle(input)) - 上下文类不关心策略内部,只保证调用约定
- 利于单元测试:可传入 mock 策略验证上下文逻辑
示例:
class PaymentProcessor {
constructor(strategy) {
this.strategy = strategy;
}
process(amount) {
return this.strategy.handle(amount);
}
}
// 具体策略
class AlipayStrategy {
handle(amount) {
return `Alipay: ¥${amount}`;
}
}
class WechatStrategy {
handle(amount) {
return `WechatPay: ¥${amount}`;
}
}
// 使用
const processor = new PaymentProcessor(new AlipayStrategy());
console.log(processor.process(99.9)); // Alipay: ¥99.9
processor.strategy = new WechatStrategy(); // 直接替换
console.log(processor.process(99.9)); // WechatPay: ¥99.9
关键注意事项
- 策略必须契约一致:所有策略接受相同参数、返回同类型结果,否则上下文无法稳定调用
-
避免策略耦合上下文:策略不应依赖
this指向上下文实例,保持无状态或仅依赖入参 - 错误防御要前置:构造时校验策略有效性,比运行时报错更友好
- 若策略需共享状态,建议通过参数传入,而非闭包捕获上下文私有属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










