策略模式可能名字很高大上,但其实它的思想我们在日常中使用得非常多,是一个简单而普遍的设计模式。
定义
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
通用类图如下:

在类图中,Context即上下文角色,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。Strategy通常是一个接口,定义策略/算法具有的方法或属性。策略模式其实就是使用了面向对象的继承和多态机制,在此基础上也没有增加多少设计,所以可能我们不经意间就用到了它。
需要注意的是,策略模式和代理模式很像,不同的是策略模式里的封装角色——Context,和被封装的策略类用的不是同一个接口。
优点
- 灵活性强,各种算法/策略可以自由切换
- 避免使用多种条件判断:对于多个策略的调用,如果采用传入多重条件判断不易维护,出错概率高。使用策略模式就简化了操作
- 拓展性良好
缺点
- 策略类要对外暴露,具有不必要的耦合性
- 策略数量容易增多,一般建议不超过4个
使用场景
- 多个类只有在算法或行为上稍有不同时;
- 需要屏蔽算法规则时
拓展
把策略模式和枚举结合在一起,叫做策略枚举,有时候在代码中会显得特别简介。策略枚举的定义为:浓缩有策略模式的枚举。
参考:
设计模式之禅