定义
策略模式是一种比较简单的模式:定义一组算法,将每个算法封装起来,并且使他们之间可以互换。
策略模式的通用类图:
策略模式使用的是面向对象的继承和多态机制,非常容易理解和掌握,
- Context封装角色
也叫上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
- Strategy抽象策略角色
策略、算法的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
- ConcreteStrategy具体策略角色
实现抽象策略中的操作,该类包含具体的算法
通用代码实现
抽象的策略角色
public interface Strategy {
//策略模式的运算法则
public void doSomething();
}
具体策略角色
public class ConcreteStrategy implements Strategy {
public void doSomething() {
System.out.println("");
}
}
封装角色
策略模式的重点是封装角色,它是借用了代理模式的思路,差别就是策略模式的封装角色和被封装的策略不用是同一个接口,如果是同一个接口那就成为代理模式了。public class Context {
//抽象策略
private Strategy strategy = NULL;
//构造函数设置具体策略
public Context(Strategy strategy) {
this.strategy = strategy;
}
//封装后的策略方法
public void doAnything(){
this.strategy.doSomething();
}
}
策略模式的应用
优点
- 算法可以自由的切换:
只要实现抽象策略,它就成为策略家族中的一个成员,通过封装角色对其进行封装,保证对外提供可自由切换的策略。
- 避免使用多重条件判断:
如果没有策略模式,一会要使用A策略一会要使用B策略,怎么设计?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增加。使用策略模式后,可以由其他模块决定使用何种策略
- 扩展性良好
缺点
- 策略类数量增多:每一个策略一个类,复用的可能性很小
- 所有的策略类都需要对外暴露
使用场景
- 多个类只有在算法或行为上稍有不同的场景
- 算法需要自由切换