用 map 替代 switch 实现策略模式,核心是将“条件分支”转为“键值映射”,提升扩展性、减少重复、增强可测试性;map 存储策略函数,键为操作类型,值为对应逻辑函数,新增策略只需插入键值对,无需修改原结构。

用 Map 替代 switch 实现策略模式,核心是把“条件分支”转为“键值映射”,让代码更易扩展、更少重复、更易测试。
用 Map 存储策略函数
每个键对应一个操作类型(如字符串、数字或 Symbol),值是执行该逻辑的函数。相比 switch,新增策略只需插入新键值对,无需修改原有结构。
例如处理不同用户角色的权限校验:
const roleHandler = new Map([
['admin', () => console.log('允许全部操作')],
['editor', () => console.log('允许编辑,禁止删除')],
['viewer', () => console.log('仅允许查看')]
]);
调用时直接查表:
function handleRole(role) {
const handler = roleHandler.get(role);
if (handler) handler();
else console.warn(`未知角色: ${role}`);
}
支持参数传递和返回值
策略函数可以接收参数并返回结果,适合需要计算或判断的场景。Map 的值可以是任意函数,包括箭头函数、普通函数甚至异步函数。
- 同步策略示例(带参数):
const discountStrategy = new Map([
['vip', amount => amount * 0.8],
['student', amount => amount * 0.9],
['default', amount => amount]
]);
<p>function calculatePrice(amount, type) {
const strategy = discountStrategy.get(type) || discountStrategy.get('default');
return strategy(amount);
}</p>
- 异步策略示例(如调用 API):
const asyncFetchers = new Map([
['user', id => fetch(`/api/users/${id}`)],
['post', id => fetch(`/api/posts/${id}`)]
]);
<p>async function fetchData(id, type) {
const fetcher = asyncFetchers.get(type);
if (!fetcher) throw new Error(<code>不支持的类型: ${type}</code>);
return await fetcher(id);
}</p>
动态注册与组合策略
Map 支持运行时增删,适合插件化或配置驱动的系统。还可以封装成类,提供注册、执行、默认兜底等能力。
class StrategyMap {
constructor(defaultFn = () => null) {
this.map = new Map();
this.default = defaultFn;
}
set(key, fn) { this.map.set(key, fn); return this; }
get(key) { return this.map.get(key) || this.default; }
execute(key, ...args) { return this.get(key)(...args); }
}
<p>// 使用
const paymentStrategy = new StrategyMap(() => Promise.reject('不支持的支付方式'));
paymentStrategy
.set('alipay', () => console.log('调起支付宝'))
.set('wechat', () => console.log('调起微信'));
paymentStrategy.execute('alipay'); // 调起支付宝</p>
注意边界与健壮性
Map 查找是严格相等(===),注意键的类型一致性;避免用对象作键(除非有意利用引用唯一性);生产环境建议加类型校验和错误日志。
- 常见陷阱:
- 传入
'1'(字符串)却用1(数字)去查,查不到 - 忘记处理未命中情况,导致
undefined()报错 - 策略函数抛错未捕获,影响主流程
推荐始终提供兜底逻辑,并在关键路径做 try/catch 或 Promise.catch。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











