定义:策略模式提供了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化。
使用场景:
1、针对统一问题的多种处理方式,仅仅使具体行为有差别时。
2、需要安全地封装多种同一类型的操作时。
3、需要同一抽象类有多个子类,而又需要使用if-else或switch-case来选择具体子类时。
工厂模式和策略模式的异同点。
相同点:会存在继承同一抽象类的多个子类或实现同一接口的多个实现类。
不同点:
1、具体实现类的创建位置不同。工厂模式的具体对象在工厂类里创建。策略模式没有工厂类,具体对象在使用类创建。
2、做重点不同。工厂模式重在创建。策略模式重在选择。
下面使用一个公共出行的计价模型来学习策略模式的使用。
public interface CalculateStrategy {
/**
* 按距离来计算价格
* @param km
* @return
*/
int calculatePrice(int km);
}
/**
* 公交车价格计算策略
*/
public class BusStrategy implements CalculateStrategy {
/**
* 北京公交车,十公里之内1元,超过十公里之后每加一元钱可以乘5公里
* @param km
* @return
*/
@Override
public int calculatePrice(int km) {
//超过十公里的总距离
int extraTotal=km-10;
//超过的距离是5公里的倍数
int extraFactor=extraTotal/5;
//超过的距离对5公里取于
int fraction=extraTotal%5;
//价格计算
int price=1+extraFactor*1;
return fraction>0?++price:price;
}
}
/**
* 地铁价格计算策略
*/
public class SubwayStrategy implements CalculateStrategy {
/**
* 6公里(含)内3元;6~12公里(含)4元;12~22公里(含)5元;22~32公里(含)6元。
*
* @param km
* @return
*/
@Override
public int calculatePrice(int km) {
if (km <= 6) {
return 3;
} else if (km <= 12) {
return 4;
} else if (km <= 22) {
return 5;
} else if (km <= 32) {
return 6;
} else {
return 7;
}
}
}
public class TranficCalculator {
static CalculateStrategy mS;
public static void main(String[] args) {
// TranficCalculator calculator = new TranficCalculator();
// //设置计算策略
// calculator.setStrategy(new BusStrategy());
// //计算价格
// Log.e("公交车乘16公里的价格:" + calculator.calculatePrice(16));
mS=new BusStrategy();
Log.e("公交车乘16公里的价格:" + mS.calculatePrice(16));
}
// CalculateStrategy mStrategy;
//
// public void setStrategy(CalculateStrategy mStrategy) {
// this.mStrategy = mStrategy;
// }
//
// public int calculatePrice(int km) {
// return mStrategy.calculatePrice(km);
// }
}
如果需要增加出租车的计算策略
/**
* 出租车计算策略
*/
public class TaxiStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
return km * 2;
}
}
网友评论