使用策略模式替代 if-else 的核心做法是将每种逻辑封装为独立的函数或对象,并建立一个映射表(map 或普通对象)将条件键与对应的处理函数关联。调用时通过查找映射表直接获取并执行函数,从而消除冗长的分支判断。若遇到键不存在的情况,应提供默认函数或抛出明确错误,确保程序行为可控。

如何构建策略映射表
构建策略映射表的关键在于定义一个包含所有可能操作类型的配置对象,每个属性名对应一种业务场景,属性值则是具体的处理函数。这种方式将分散的条件判断集中管理,便于后续扩展新的策略而无需修改原有代码结构。

const strategies = {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
multiply: (a, b) => a * b,
divide: (a, b) => b !== 0 ? a / b : NaN
};
function calculate(operation, a, b) {
const handler = strategies[operation];
if (!handler) {
throw new Error(`Unsupported operation: ${operation}`);
}
return handler(a, b);
}
上述代码定义了四个基本运算策略,并通过 calculate 函数统一入口。当传入有效的操作符时,直接从 strategies 中取出对应函数执行;若传入非法操作符,则抛出异常。这种结构清晰分离了数据定义与执行逻辑。
如何处理动态策略加载
在实际应用中,策略可能来自外部配置或用户输入,因此需要支持动态注册和更新策略。可以通过提供一个注册方法,允许在运行时向映射表添加新策略,同时保持核心计算逻辑不变。

class StrategyContext {
constructor() {
this.strategies = {};
}
register(name, fn) {
this.strategies[name] = fn;
}
execute(name, ...args) {
const handler = this.strategies[name];
if (!handler) {
throw new Error(`Strategy ${name} not found`);
}
return handler(...args);
}
}
const context = new StrategyContext();
context.register('add', (a, b) => a + b);
context.register('subtract', (a, b) => a - b);
console.log(context.execute('add', 5, 3)); // 8
该示例展示了如何使用类封装策略上下文,支持动态注册和执行策略。这种方式特别适合插件化架构或需要根据配置动态调整行为的场景。每个策略独立注册,互不干扰,且易于测试和维护。
基于未注册策略调用的具体结果问题
当调用 execute 方法时传入一个未在 register 中注册的策略名称,程序会立即抛出 Error 异常,提示“Strategy [name] not found”。这是由 execute 方法中的非空检查逻辑决定的,旨在防止静默失败或返回未定义行为。开发者应在调用前确保策略已正确注册,或在调用处捕获该异常进行降级处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











