策略模式 的简单理解
定义 策略模式定义了一系列算法并将每个算法封装起来,而且使它们还可以相互替换。策略模式
让算法独立于使用它的客户而独立变化。
策略模式的使用场景:
(1)针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
(2)需要安全地封装多种同一类型的操作时。
(3)出现同一抽象类有多个子类,而又需要使用if-else 或者 使用switch来选择具体子类时。
策略模式的简单实现。
通常如果一个问题有多个解决方案时,最简单的就是if-else 或者 switch但是这方案问题太多,耦合性太高,
代码臃肿难以维护等等。但是如果解决方案中包括大量的处理逻辑需要封装,或者需要处理方式变动较大的时候就显得
混乱、复杂,当需要修增加一种方案时就要修改类中的代码,这显然不符合开闭原则。面对这种情况呢策略模式就能很好的
解决问题,他将各种方案分离开来,让程序客户端根据具体需要来动态地选择不同的策略方案。下面看一个例子
北京公交系统的计费功能:
//计算接口
public interface CalculateStrategy {
/**
* 按距离计算价格
* @param km
* @return
*/
int calculatePrice(int km);
}
对于每一种出行方式我们都有一个独立的计算策略类,这些类都实现了CalculateStrategy接口
//公交车计算策略(分段计费)
public class BusStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
int extraTotal = km - 10;
int extraDactor = extraTotal / 5;
int factor = extraDactor % 5;
int price = 1 + extraDactor * 1;
return factor > 0? ++ price : price;
}
}
//地铁计算策略
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 CliteCulculate {
CalculateStrategy calculateStrategy;
public static void main(String[] args){
CliteCulculate cliteCulculate = new CliteCulculate();
cliteCulculate.setCalculateStrategy(new SubwayStrategy());
System.out.println(cliteCulculate.calculate(654));
}
public void setCalculateStrategy(CalculateStrategy calculateStrategy) {
this.calculateStrategy = calculateStrategy;
}
public int calculate(int km){
return calculateStrategy.calculatePrice(km);
}
}
通过建立抽象将不同的策略构建成一个具体的策略实现,通过不同的策略实现算法替换。在简化逻辑结构的同时,增强了
系统的可读性、稳定性、可扩展性,这对于较为复杂的业务逻辑显得更为直观 扩展也更方便。