参考《Java设计模式》、《设计模式之禅》、《headfirst设计模式》
目录
一、简介
策略模式是一个计划或方式,给定一个输入条件,获得一个输出。通常策略会提供一组可互换的方法。
- 提供一个接口,将不同的可互换的策略抽离出来,封装在各自独立的类来实现接口
使用背景:
- 程序存在多种策略时,策略的选择和执行逻辑混合在一个方法时,导致复杂度增加时,即可使用策略模式来简化。
二、使用策略模式
需要以下步骤:
- 创建一个接口来定义策略操作
- 分别用不同的类来实现该策略接口
- 重构代码,选择使用正确的策略类
例子:广告引擎之广告推荐
三、策略模式的优缺点
3.1 优点:
- 策略可以自由切换
- 避免使用多重条件判断:把判断选择策略的逻辑放到其他模块,策略家族只提供访问接口
- 扩展性良好
3.2 缺点:
- 策略类数量增多
- 所有的策略类都需要对外暴露
- 上层模块必须知道有哪些策略,才能决定使用哪个,与迪米特法则相违背。只使用了一个策略,为什么要知道其他策略呢?
- 解决方法:结合其他模式来修正该缺陷:如工厂方法、代理模式或者享元模式
- 备注:迪米特原则:迪米特原则简介
迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least Knowledge Principle, LKP)。
四、使用场景及注意事项
4.1 使用场景
- 多个类只在策略或者行为上稍有不同
- 策略需要自由切换的场景
- 例如策略的选择由使用者决定,或者策略始终在金华
- 需要屏蔽策略规则的场景
4.2 注意事项
如果策略数量超过4个,则需要考虑混合模式。实际项目中,一般通过工厂方法模式来实现策略类的声明