定义
定义一组算法,将每组算法封装起来,并且使它们可以互换
话句话说策略模式就是将算法逻辑作为可更换的部分,根据实际场景调用不同的算法
结构和实现
结构
- Context上下文:
Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 - 抽象策略角色
抽象策略角色,是对策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。 - 具体策略角色
用于实现抽象策略中的操作,即实现具体的算法
实现
以三国为例,三国时期有个著名测词汇叫做锦囊妙计,将的是刘备迎娶东吴孙尚香时,诸葛亮给了赵云三个锦囊妙计,吩咐赵云在三个危机的时候打开。在这里锦囊就是我们的上下文Context,其中包含的三个算法就是我们策略模式中的算法。在危急时刻,赵云可以通过锦囊来使用三个算法
妙计(抽象策略角色)
public interface Strategy {
//妙计的抽象
public void executeStrategy();
}
锦囊(Context上下文)
public class Bag {
private Strategy strategy;
public Bag(Strategy _strategy){
this.strategy = _strategy;
}
public void execute(){
this.strategy.executeStrategy();
}
}
具体妙计1(具体策略角色1)
public class ConcreateStrategy1 implements Strategy{
@Override
public void executeStrategy() {
System.out.println("找乔国老求救");
}
}
具体妙计2(具体策略角色2)
public class ConcreateStrategy2 implements Strategy{
@Override
public void executeStrategy() {
System.out.println("骗刘备说曹操举兵南下,速回荆州");
}
}
具体妙计3(具体策略角色3)
public class ConcreateStrategy3 implements Strategy{
@Override
public void executeStrategy() {
System.out.println("让孙夫人挡追兵");
}
}
赵云(Client)
public class ZhaoYun {
public static void main(String[] args) {
Bag bag;
bag = new Bag(new ConcreateStrategy1());
bag.execute();
bag = new Bag(new ConcreateStrategy2());
bag.execute();
bag = new Bag(new ConcreateStrategy3());
bag.execute();
}
}
输出
找乔国老求救
骗刘备说曹操举兵南下,速回荆州
让孙夫人挡追兵
特点
优点
- 算法可以自由切换
- 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
- 扩展性良好,增加一个策略只需实现接口即可
缺点
- 策略类数量会增多,每个策略都是一个类,复用的可能性很小
- 所有的策略类都需要对外暴露
使用场景
- 多个类只有算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
总结
策略模式的思想其实在日常使用中经常会使用到。比如我们List中排序方法用到的Comparator接口实现就是一个体现。这种模式相对简单直接,但是还是需要经过大量的练习才能活用