1. 引言:if-else 正在失控
在实际项目中,你很可能见过这样的代码:
public double calculate(double price, String type) {
if ("VIP".equals(type)) {
return price * 0.8;
} else if ("SVIP".equals(type)) {
return price * 0.6;
} else if ("NORMAL".equals(type)) {
return price;
}
return price;
}
问题非常明显:
- if-else 越来越长
- 新规则要改老代码
- 违反开闭原则
当条件分支开始膨胀时,策略模式就是最优解。
2. 什么是策略模式
GoF 定义
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。
详解:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
一句话理解:
把算法当成对象来用。
3. 策略模式的核心思想
策略模式的本质是:
- 行为抽象
- 算法解耦
- 运行期切换
它强调:
用组合代替条件判断。
4. 策略模式的结构
策略模式包含三个角色:
- Strategy(策略接口)类
这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- ConcreteStrategy(具体策略)类
实现了抽象策略定义的接口,提供具体的算法实现或行为。
- Context(上下文)
持有一个策略类的引用,最终给客户端调用。
5. 示例:商品价格计算
5.1 策略接口
{
;
}


