前言
在软件开发中常会遇到实现某一个功能可以有多种策略或算法,根据实际情况选择不同的算法或策略。如果将这些算法或者策略抽象出来,提供一个统一的接口。不同的算法或策略有不同的实现类。可以通过注入不同的实现对象来实现算法或策略的动态替换,这就是策略模式
定义
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化
UML
使用场景
- 针对同一类问题的多种处理方式,仅仅是具体行为有差别
- 需要安全地封装多种同一类型的操作时
- 出现同一抽象类多个子类,而又需要使用if-else 或者switch-case来选择具体子类时
实操
城市公共交通出行方式费用进行举例,一般实行分段计价:乘坐距离越远,价格越高
// 定义一个抽象的价格计算接口
public interface CalculateStrategy{
int calculatePrice(int km)
}
// 公交车的计算策略类
public class BusStrategy implements CalculateStrategy{
@override
public int calculatePrice(int km){
return 1 // 这里简单起见,实际按照公交车乘车规则计费
}
}
// 地铁的计算策略类
public class SubwayStrategy implements CalculateStrategy{
@override
public int calculatePrice(int km){
return 2 // 这里简单起见,实际按照地铁乘车规则计费
}
}
// 出行价格计算器
public class TranficCalculator{
CalculateStrategy mStrategy;
public void setStrategy(CalculateStrategy mStrategy){
this.mStrategy=mStrategy
}
public int calculatePrice(int km){
return mStrategy.calculatePrice(km);
}
}
public static void main(String [] args){
TranficCalculator calculator=new TranficCalculator ();
// 公交车费用
calculator.setStrategy(new BusStrategy());
// 地铁费用
calculator.setStrategy(new SubwayStrategy());
}
小结
策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好地演示了开闭原则,也就是定义抽象,注入不同实现,从而达到很好的可拓展性
优点
- 策略模式提供了管理相关的算法族的办法,算法可以切换
- 避免使用多重条件转移语句
缺点
- 客户端知道所有的策略类,并自行决定使用哪一个策略类。策略类完成暴露了
- 策略类有时会非常多