用策略模式和查表法替代长if-else,将条件判断逻辑转为数据或类型驱动:通过键索引策略对象、类多态+工厂分派,或Map提升灵活性与健壮性,辅以严格边界处理与类型约束。

用多态分派(如策略模式)和查表法(对象映射或 Map)替代长 if-else,核心是把“条件判断逻辑”从代码中抽离,转为数据驱动或类型驱动。不是消灭判断本身,而是让判断更易读、可测、可扩展。
用策略对象 + 查表法替代条件分支
把每个分支封装成独立策略对象,用键(如字符串、枚举、类型名)索引到对应策略,运行时直接调用,无需逐条比对。
例如处理不同支付方式:
const paymentStrategies = {
'alipay': { charge: (order) => /* 支付宝逻辑 */ },
'wechat': { charge: (order) => /* 微信逻辑 */ },
'credit_card': { charge: (order) => /* 银行卡逻辑 */ }
};
<p>function processPayment(type, order) {
const strategy = paymentStrategies[type];
if (!strategy) throw new Error(<code>Unsupported payment type: ${type}</code>);
return strategy.charge(order);
}</p>优点:新增支付方式只需往对象里加一项,不改原有逻辑;单元测试可单独覆盖每个策略;类型检查(配合 TypeScript)能提前发现非法 key。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用 class 多态 + 工厂函数实现运行时分派
当行为差异大、状态多、需复用生命周期或内部方法时,用类继承 + 工厂更清晰。JavaScript 虽无传统虚函数表,但靠原型链和 this 绑定天然支持多态调用。
class PaymentStrategy {
charge(order) { throw new Error('Not implemented'); }
}
<p>class AlipayStrategy extends PaymentStrategy {
charge(order) { /<em> 实现 </em>/ }
}</p><p>class WechatStrategy extends PaymentStrategy {
charge(order) { /<em> 实现 </em>/ }
}</p><p>const strategyFactory = {
alipay: () => new AlipayStrategy(),
wechat: () => new WechatStrategy(),
credit_card: () => new CreditCardStrategy()
};</p><p>function getStrategy(type) {
const factory = strategyFactory[type];
if (!factory) throw new Error(<code>Unknown strategy: ${type}</code>);
return factory();
}</p><p>// 使用
getStrategy('alipay').charge(order);</p>适合需要初始化、持有私有状态、或共享基类方法的场景。TypeScript 中还能利用泛型约束确保返回类型安全。
用 Map 替代普通对象提升健壮性与灵活性
当 key 是动态生成、可能含特殊字符、或需弱引用/唯一性保障时,Map 比 plain object 更合适。它支持任意类型 key(包括 symbol、对象、函数),且不会被原型污染干扰。
- 避免对象 key 被 toString() 强制转换(比如用对象作 key 时)
- 可存储 null/undefined 作为 key(Object 不行)
- 遍历顺序严格按插入顺序,语义更可控
- 搭配 WeakMap 可实现基于实例的策略缓存,避免内存泄漏
const handlerMap = new Map();
<p>handlerMap.set('CREATE', (data) => createItem(data));
handlerMap.set('UPDATE', (data) => updateItem(data));
handlerMap.set(Symbol.for('DELETE'), (data) => deleteItem(data));</p><p>function dispatch(action, data) {
const handler = handlerMap.get(action);
if (!handler) throw new Error(<code>No handler for ${action}</code>);
return handler(data);
}</p>边界处理与错误防御不能省
查表法看似简洁,但缺失 key 的运行时错误更隐蔽。必须明确约定 fallback 行为:
- 默认策略(default handler)用于兜底,而非抛错(尤其在高可用场景)
- 开发环境开启 strict 模式:未注册的 key 直接报错;生产环境降级为日志 + 默认行为
- 配合 TypeScript 的 keyof 或 const assertions,把 key 限定在已知集合内
- 启动时校验所有策略是否实现必需方法(如 charge、validate),避免运行时报 method undefined
查表不是银弹——它把 if-else 搬到了数据结构里,但没消除决策逻辑。真正的简化来自职责分离:条件由外部输入决定,行为由策略封装,调度由查表完成。维护成本从“改一段嵌套代码”变成“增一个配置项 + 一个函数”。

















