定义
定义一系列的算法,把他们一个个的封装起来,并且使他们可以互相替换,本模式使得算法可以独立于使用它的客户而变化。
本质
分离算法,选择实现。
登场角色
-
Strategy(策略)
负责决定实现策略所必需的接口,用来约束一系列具体的策略算法。
-
ConcreteStrategy(具体的策略)
实现具体的策略(战略、方向和算法等)。
-
Context(上下文)
负责使用策略角色,保存了策略角色实例,并使用他去实现功能。
代码示例
/**
* 策略,用来约束一系列具体的策略算法
*/
public interface CalculateStrategy {
/**
* 按照距离计算公里数
* @param km
* @return
*/
int calculatePrice(int km);
}
/**
* 公交车价格计算策略
*/
public class BusStrategy implements CalculateStrategy{
@Override
public int calculatePrice(int km) {
/*
这里是公交车价格计算策略的具体计算过程
这里简单计算
*/
return km * 1;
}
}
/**
* 地铁价格计算策略
*/
public class SubwayStrategy implements CalculateStrategy{
@Override
public int calculatePrice(int km) {
/**
* 这里是地铁价格计算策略
*/
return km * 2;
}
}
/**
* 上下文,使用策略的角色
*/
public class TranficCalculator {
CalculateStrategy mCalculateStrategy;
public static void main(String[] args){
TranficCalculator tranficCalculator = new TranficCalculator();
tranficCalculator.setmCalculateStrategy(new BusStrategy());
System.out.println("公交车价格计算");
System.out.println(tranficCalculator.calculatePrice(3));
tranficCalculator.setmCalculateStrategy(new SubwayStrategy());
System.out.println("地铁价格计算");
System.out.println(tranficCalculator.calculatePrice(3));
}
public void setmCalculateStrategy(CalculateStrategy mCalculateStrategy) {
this.mCalculateStrategy = mCalculateStrategy;
}
public int calculatePrice(int km){
return mCalculateStrategy.calculatePrice(km);
}
}
运行结果
公交车价格计算
3
地铁价格计算
6
优点
- 定义一系列的算法,让这些算法可以互相替换。
- 避免多重条件语句。
- 更好的扩展性,扩展新的算法非常容易,只需要计算策略抽象类或者接口即可。
缺点
- 使用时必须了解每种策略的不同。
- 因为减少了条件语句,所以增加了对象的数量,因为其可以看成是对条件语句的拆分。
何时使用
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
- 需要安全的封装同一类型的多种操作时。
- 出现同一个抽象类的多个子类,而又需要使用if-else或者switch-case来选择具体的子类时。
网友评论