策略模式通过将分支逻辑抽离为独立函数或类,统一入口调用,避免if-else堆叠;轻量场景用策略表对象映射,复杂场景用类封装+上下文调度,可配合工厂解耦创建,但需避免过度设计。

用策略模式优化多条件分支,核心是把每个分支逻辑抽成独立函数或对象,再通过统一入口按需调用,避免硬编码的 if-else 堆叠。它不只让代码更清晰,还能提升可测试性、支持运行时动态切换,对高频调用场景也有实际性能收益。
把条件映射成策略对象
最轻量的做法是用普通对象做“策略表”,键为条件值,值为对应处理函数:
- 适合条件单一(如字符串、数字枚举)、逻辑较短的场景
- 避免每次调用都 new 实例或重复判断,直接查表取函数执行
- 新增类型只需往对象里加一项,不改原有逻辑
例如折扣计算:
const discountStrategies = {VIP: () => 0.2,
Regular: () => 0.1,
New: () => 0.05,
default: () => 0
};
function calculateDiscount(userType) {
return (discountStrategies[userType] || discountStrategies.default)();
}
封装成类策略 + 上下文管理
当每个分支逻辑变复杂(含状态、依赖、异步操作),建议用类封装策略,并由上下文(Context)统一调度:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每个策略类实现统一接口(如 execute()),保证调用一致性
- 上下文负责接收输入、选择策略、委托执行,隐藏内部细节
- 策略可复用、可单元测试,也便于注入 mock 或替换实现
示例:
class VIPDiscountStrategy {execute() { return 0.2; }
}
class PremiumDiscountStrategy {
constructor(minSpend) { this.minSpend = minSpend; }
execute(orderAmount) { return orderAmount >= this.minSpend ? 0.25 : 0.15; }
}
class DiscountContext {
constructor(strategyMap) {
this.strategies = strategyMap;
}
calculate(userType, orderAmount) {
const strategy = this.strategies[userType];
return strategy ? strategy.execute(orderAmount) : 0;
}
}
const context = new DiscountContext({
VIP: new VIPDiscountStrategy(),
Premium: new PremiumDiscountStrategy(500)
});
配合工厂模式动态创建策略
若策略初始化需要参数或依赖外部服务,可用工厂函数解耦创建过程:
- 避免上下文感知具体构造细节
- 方便做依赖注入、缓存实例、或按环境返回不同策略
- 策略本身保持无状态或仅持必要配置
例如:
const strategyFactory = {VIP: () => new VIPDiscountStrategy(),
Premium: (config) => new PremiumDiscountStrategy(config.minSpend),
Trial: (user) => new TrialDiscountStrategy(user.signupDate)
};
class DiscountContext {
getStrategy(userType, config) {
return this.factory[userType]?.(config) || this.factory.default?.();
}
}
注意边界:不是所有场景都要上策略模式
策略模式适合分支多、变化频繁、逻辑差异大、或需运行时切换的场景。但也要警惕过度设计:
- 只有 2–3 个简单分支,用对象映射或三元运算符更直接
- 条件组合复杂(如多字段联合判断),先考虑归一化输入,再匹配策略
- 性能敏感路径中,确保策略查找本身不引入额外开销(比如避免每次都 Object.keys() 遍历)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










