- 策略模式定义了一系列的算法,并将一系列算法封装起来,使他们能相互替换。策略模式让算法独立于使用者而独立变化。
(1)策略设计模式实现
- 声明一个接口,声明一个计算方法
public interface CalculateStrategy {
int calculatePrice(int km);
}
- 实现三个具体的计算方法
public class BusCalculate implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
int busP = 2;
if (km>5)
busP = busP+km-5;
return busP;
}
}
public class SubwayCalculate implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
int subwayP=0;
if (km<5)
subwayP = 3;
if (km>5&&km<=10)
subwayP=4;
if (km>10)
subwayP=5;
return subwayP;
}
}
public class TaxiCalculate implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
return 2 * km;
}
}
- 创建一个计算类
public class PriceCalculate {
private CalculateStrategy calculateStrategy;
public void setCalculateStrategy(CalculateStrategy calculateStrategy){
this.calculateStrategy = calculateStrategy;
}
public int getPrice(int km){
return calculateStrategy.calculatePrice(km);
}
}
- 代码调用实现
PriceCalculate priceCalculate = new PriceCalculate();
priceCalculate.setCalculateStrategy(new SubwayCalculate());
int price = priceCalculate.getPrice(10);
System.out.println(price);
优点
- 使用策略模式可以避免使用多重条件转移语句,封装更彻底,数据更安全。
- 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。
- 耦合度低,都是基于接口调用和实现,便于拓展和修改。
缺点
- 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类