
根据《设计模式之美》,策略模式(Strategy Pattern)是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通俗一点,就是你去买菜,可以选择骑共享单车去菜市场,也可以坐公交车,也可以滴滴打车,当然也可以选择不行,骑共享单车、坐公交车、滴滴打车、步行这都是不同的策略,但是你们的出发点和目的地都是一样的,因此这些策略是可以互换的,不影响你去买菜。
当使用超过3层的if-else或者长串的switch条件判断,我们就要考虑使用策略模式了,当然不只是这一种方法,工厂模式、状态模式也可以。
这是为什么呢?
因为使用超过3层的if-else或者长串的switch条件判断违反了:

这是因为热水需要一定时间才能到你身上。还有一个重要的原因是旋钮的刻度不是均匀的。所以我们使用起来不方便。
但是如果我们采取单一职责原则,热水一个旋钮,冷水一个旋钮,就能容易控制了。
如果使用超过3层的if-else或者长串的switch条件判断且之中的代码量比较大时,后续代码的扩展和修改就会变得异常困难。
下面就来用策略模式,实现我们去菜市场买菜的情形吧~
接口:
/**
* 去菜市场策略的接口(Strategy)
*/
interface goToMarketStrategy {
void action();
}具体方式,比如骑共享单车。
/**
* 骑共享单车(ConcreteStrategy)
*/
public class sharedBike implements goToMarketStrategy {
@Override
public void action() {
System.out.println("骑上我心爱的小单车...");
}
}具体方式,坐公交车。
/**
* 坐公交车(ConcreteStrategy)
*/
public class Bus implements goToMarketStrategy {
@Override
public void action() {
System.out.println("滴!学生卡...");
}
}滴滴太贵了,咋就不坐了~
具体方式,步行。
/**
* 步行(ConcreteStrategy)
*/
public class walking implements goToMarketStrategy {
@Override
public void action() {
System.out.println("我爱走路,身体棒棒...");
}
}环境类 谁决策,我决策。
/**
* 小伞(Context)
*/
public class 小伞 {
private goToMarketStrategy strategy ;
public 小伞(goToMarketStrategy strategy) {
this.strategy = strategy;
}
// 居家好男人要去买菜了。
// 具体执行哪个,看我选哪个。
public void exec() {
strategy.action();
}
}你是上帝,你来。。。
public class Main {
public static void main(String[] args) {
//第一个叫小伞的boy走路去买菜。
小伞 boy1 = new 小伞(new walking());
boy.exec();
//第二个叫小伞的boy骑共享单车去买菜。
小伞 boy2 = new 小伞(new sharedBike());
boy.exec();
// ......
}
}优点:
缺点: