1.定义
策略模式定义了一系列算法,并将每个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
2.使用场景
1) 针对同一类型问题的多种处理方式,仅仅是具体行为有差别。
2) 需要安全地封装多种同一类型的操作时。
3) 出现同一抽象类有多个子类,又需要使用 if..elss 或者 switch...case 来选择具体子类。
3.简单实现
以地铁公交车计算出行成本价格为例。
//出行成本计算接口 interface CalculateStrategy{ int calculatePrice(int km); } //公交车价格计算策略 class BusStrategy implements CalculateStrategy{ //十公里以内1元,超过十公里之后加1元可坐5公里 @Override public int calculatePrice(int km) { //超过距离为5的倍数 int extFactor = (km - 10) / 5; //超过距离取余 int fraction = (km - 10) % 5; //计算超出距离的价格 int price = 1 + extFactor * 1; int extPri = fraction > 0 ? ++price : price ; return km <= 10 ? 1 : extPri; } } //地铁价格计算策略 class SubwayStrategy implements CalculateStrategy{ //6公里以内3元,6到12公里4元,12到22公里5元,22到32公里6元,其他7元。 @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 StrategyMode { CalculateStrategy mStrategy; public void setStrategy(CalculateStrategy calculateStrategy){ mStrategy = calculateStrategy; } public int calculatePrice(int km){ return mStrategy.calculatePrice(km); } public static void main(String[] args){ StrategyMode strategyMode = new StrategyMode(); //设置公交车价格策略 strategyMode.setStrategy(new BusStrategy()); System.out.println("乘坐16km公交车价格:" + strategyMode.calculatePrice(16) ); //设置地铁出行策略 strategyMode.setStrategy(new SubwayStrategy()); System.out.println("乘坐16km地铁价格:" + strategyMode.calculatePrice(16)); } }
输出:
策略模式隐藏实现的同时拓展性也变得很强,例如添加一个出租车出行价格计算。
//出租车价格策略 class TaxiStrategy implements CalculateStrategy{ // 简单规则为 一公里2元 @Override public int calculatePrice(int km) { return km * 2; } }
public class StrategyMode { CalculateStrategy mStrategy; public void setStrategy(CalculateStrategy calculateStrategy){ mStrategy = calculateStrategy; } public int calculatePrice(int km){ return mStrategy.calculatePrice(km); } public static void main(String[] args){ StrategyMode strategyMode = new StrategyMode(); //设置公交车价格策略 strategyMode.setStrategy(new BusStrategy()); System.out.println("乘坐16km公交车价格:" + strategyMode.calculatePrice(16) ); //设置地铁出行策略 strategyMode.setStrategy(new SubwayStrategy()); System.out.println("乘坐16km地铁价格:" + strategyMode.calculatePrice(16)); //设置出租车价格 strategyMode.setStrategy(new TaxiStrategy()); System.out.println("乘坐16km出租车价格:" + strategyMode.calculatePrice(16)); } }
输出:
4.小结
优点:
1.结构清晰,使用简单直观;
2.耦合度相对较低,拓展方便;
3.操作封装更为彻底,数据更为安全。
缺点:
随着策略增加,子类会变得繁多。