一、意图
定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换。本模式使得算法可独立于使用它的客户而变化。
二、适用性
以下情况可使用Strategy模式
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
- 需要使用一个算法的不同变体。例如,你可能会定义一些反应不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
- 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的,与算法相关的数据结构。
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入他们各自的Strategy类中以替代这些条件语句。
三、结果
四、代码
public interface CalculateStrategy {
/**
* 按距离计算价格
*
* @param km 公里
* @return 返回价格
*/
int calculatePrice(int km);
}
public class BusStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
int extraTotal = km - 10;
int extraFactor = extraTotal / 5;
int fraction = extraFactor % 5;
int price = 1 + extraFactor * 1;
return fraction > 0 ? ++price : price;
}
}
public class TaxiStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
return km*2;
}
}
public class SubwayStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
if (km <= 6) {
return 3;
} else if (km > 6 && km < 12) {
return 4;
} else if (km > 12 && km < 22) {
return 5;
} else if (km > 22 && km < 32) {
return 6;
}
return 7;
}
}
public class PriceCalculator {
CalculateStrategy mStrategy ;
public void setStrategy(CalculateStrategy mStrategy) {
this.mStrategy = mStrategy;
}
public int calculatePrice(int km){
return mStrategy.calculatePrice(km);
}
}
public class Client {
public static void main(String[] args){
PriceCalculator priceCalculator = new PriceCalculator();
priceCalculator.setStrategy(new BusStrategy());
int busPrice =priceCalculator.calculatePrice(20);
priceCalculator.setStrategy(new TaxiStrategy());
int taxiPrice = priceCalculator.calculatePrice(20);
priceCalculator.setStrategy(new SubwayStrategy());
int subwayPrice = priceCalculator.calculatePrice(20);
System.out.printf("bus:%d ,taxi:%d,subway:%d",busPrice,taxiPrice,subwayPrice);
}
}
输出结果:
bus:4 ,taxi:40,subway:5