介绍
策略模式(Strategy Pattern)定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
优缺点
优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
缺点
- 策略类会增多
- 所有策略类都需要对外暴露
使用场景
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
- 需要安全的封装多种同一类型的操作时
- 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时
注意事项:
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
举例
计算接口类
public interface CalculateStrategy {
/**
* 计算价格
* @param km 公里数
*/
void calculatePrice(int km);
}
公交计算类
public class BusStrategy implements CalculateStrategy {
@Override
public void calculatePrice(int km) {
System.out.println("公交车价格");
}
}
地铁计算类
public class SubwayStrategy implements CalculateStrategy {
@Override
public void calculatePrice(int km) {
System.out.println("地铁价格");
}
}
创建一个扮演Context角色的类
public interface ITranficCalculate {
void calculatePrice(int km);
}
实现类
public class TranficCalculate implements ITranficCalculate{
private CalculateStrategy calculateStrategy;
@Override
public void calculatePrice(int km) {
calculateStrategy.calculatePrice(km);
}
public void setCalculateStrategy(CalculateStrategy calculateStrategy) {
this.calculateStrategy = calculateStrategy;
}
}
客户端调用
public class Client {
public static void main(String[] args) {
TranficCalculate tranficCalculate = new TranficCalculate();
tranficCalculate.setCalculateStrategy(new SubwayStrategy());
tranficCalculate.calculatePrice(10);
}
}