策略模式通过将条件分支逻辑封装为独立函数或类,并用查找表(对象/map)统一调度,避免if嵌套;支持动态注册、状态管理、工厂创建及默认兜底,提升可维护性与扩展性。

用策略模式替换复杂的 if 分支,核心是把每个条件分支的逻辑封装成独立的策略函数或类,再通过查找表(如对象或 Map)统一调度,避免嵌套和重复判断。
把分支逻辑抽成独立函数
原 if 链通常根据某个值(如类型、状态、等级)执行不同操作。先将每种情况的处理逻辑拆成纯函数,函数名体现意图,参数保持一致:
// ❌ 原始写法
if (type === 'email') {
sendEmail(user, content);
} else if (type === 'sms') {
sendSMS(user, content);
} else if (type === 'wechat') {
sendWechat(user, content);
} else {
throw new Error('Unsupported type');
}
✅ 改造后:
const strategies = {
email: (user, content) => sendEmail(user, content),
sms: (user, content) => sendSMS(user, content),
wechat: (user, content) => sendWechat(user, content)
};
<p>const handler = strategies[type];
if (!handler) throw new Error(<code>No strategy for ${type}</code>);
handler(user, content);</p>用 Map 管理动态或带状态的策略
当策略需要初始化、持有内部状态,或需运行时注册(比如插件系统),Map 比普通对象更灵活:
const strategyMap = new Map();
<p>// 注册策略
strategyMap.set('vip', class {
execute(order) {
return order.total <em> 0.9;
}
});
strategyMap.set('student', class {
constructor(school) {
this.school = school;
}
execute(order) {
return order.total </em> 0.85;
}
});</p><p>// 使用
const StrategyClass = strategyMap.get(user.role);
if (!StrategyClass) throw new Error('No pricing strategy');
const strategy = new StrategyClass(user.school);
const finalPrice = strategy.execute(order);</p>配合工厂函数统一创建策略实例
若策略构造复杂(如依赖多个服务),可加一层工厂,隐藏创建细节,保持调用简洁:
const createStrategy = (type, dependencies) => {
switch (type) {
case 'payment-alipay':
return new AlipayStrategy(dependencies.http);
case 'payment-wechat':
return new WechatStrategy(dependencies.http, dependencies.storage);
default:
throw new Error(`Unknown payment type: ${type}`);
}
};
<p>// 使用时只需传类型和依赖,不关心内部构造
const paymentStrategy = createStrategy('payment-wechat', { http, storage });
paymentStrategy.pay(amount);</p>补充:自动 fallback 与默认策略
生产环境常需兜底。可在查找失败时返回默认策略,而不是抛错:
const getStrategy = (type) => {
return strategies[type] || strategies.default || (() => console.warn('Using fallback'));
};
<p>getStrategy('unknown')(user, content); // 安全执行</p>不复杂但容易忽略。关键是让判断逻辑退居幕后,让行为本身成为一等公民。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











