策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换.策略模式让算法独立于使用它的客户而独立变化.
使用场景
1.针对同一类型问题的多种处理方式,仅仅具体行为有差别时.
2.一个系统需要动态地在几种算法中选择一种。
3.如果一个对象有很多的行为,而又需要使用if-else 或者 switch-case 来选择具体子类时,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
优点:
1.算法可以自由切换
2.避免使用多重条件判断
3.耦合度较低,扩展性良好
缺点:
1.随着策略增多,子类也会变得繁多。
2.所有策略类都需要对外暴露
package 策略模式;
public class PriceCaculator {
public static final int BUS = 1;
public static final int SUBWAY = 2;
public static void main(String[] args) {
PriceCaculator caculator = new PriceCaculator();
System.out.println("坐16公里的公交车票价为:"+caculator.caculatePrice(16, BUS));
System.out.println("坐16公里的地铁票价为:"+caculator.caculatePrice(16, SUBWAY));
}
private int busPrice(int km) {
int extraTotal = km - 10;
int extraFactor = extraTotal / 5;
int fractor = extraTotal % 5;
int price = 1 + extraFactor * 1;
return fractor > 0 ? ++price : price;
}
private int subwayPrice(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;
}
private int caculatePrice(int km,int type) {
if(type == BUS) {
return busPrice(km);
}else if(type == SUBWAY) {
return subwayPrice(km);
}
return 0;
}
}