定义
- 策略模式定义了一系列的算法,并将各个算法进行封装,并且在使用这些算法时可相互替换;策略模式让算法相对独立,具体使用时可独立变化
使用场景
- 针对同一问题有多种处理方式,只是具体行为有差别
- 出现同一抽象类的多个具体子类,代码中使用if-else来判断选择具体使用哪一种子类
- 需要隔离封装多种实现同一类型的具体操作时
UML类图

简单实现
- 需求:上班可以使用多种交通工具,分别计算各种交通工具的成本
- 1.定义策略接口
public interface CalculateStrategy {
int calculate(int km);
}
public class BusStrategy implements CalculateStrategy {
@Override
public int calculate(int km) {
int extraKm = km - 10;
int extraFactor = (int) Math.ceil(extraKm / 5.0);
return 1 + extraFactor;
}
}
public class SubwayStrategy implements CalculateStrategy {
@Override
public int calculate(int km) {
if (km <= 6) {
return 3;
} else if (km <= 12) {
return 4;
} else if (km <= 22) {
return 5;
} else {
return 6;
}
}
}
public class ClientCalculate {
private CalculateStrategy calculateStrategy;
public void setCalculateStrategy(CalculateStrategy calculateStrategy) {
this.calculateStrategy = calculateStrategy;
}
public static void main(String[] args) {
ClientCalculate clientCalculate = new ClientCalculate();
clientCalculate.setCalculateStrategy(new BusStrategy());
System.out.println("公交14km价格:" + clientCalculate.calculatePrice(14));
clientCalculate.setCalculateStrategy(new SubwayStrategy());
System.out.println("地铁12km价格:" + clientCalculate.calculatePrice(12));
}
private int calculatePrice(int km) {
return calculateStrategy.calculate(km);
}
}

应用举例
- Android动画中的时间插值器TimeInterpolartor,默认包括线性插值器(LinearInterpolator)、加速减速插值器(AccelerateDecelerateInterpolator)以及减速插值器(DecelerateInterpolator)
优缺点
- 优点
- 耦合度低扩展方便
- 封装了操作,数据安全性更高
- 结构清晰,使用简单,易于维护
- 缺点
与工厂模式的区别
- 工厂模式中只管生产实例,具体怎么使用工厂实例由调用方决定,策略模式是将生成实例的使用策略放在策略类中配置后才提供给调用方使用
- 工厂模式调用方可以直接调用工厂实例的方法属性等,策略模式不能直接调用实例的方法属性,需要在策略类中封装策略后调用