1、定义
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。Strategy模式使算法可独立于使用它的客户而变化
2、动机
- 如果一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。
- 如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法类的子类。
- 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复发的和只与算法有关的数据。
3、类结构
StrategyInterface类:策略模式抽象类,定义各种算法通用的接口。
CStrategyClass1、CStrategyClass2和CStrategyClass3类:继承StrategyInterface类并实现算法。
Context类:连接客户端和算法类,封装算法切换逻辑。
4、优缺点
优点:
1)提供管理相关算法族的办法
2)避免了使用多重条件判断语句
缺点:
1)客户端必须知道所有的策略类及它们的区别,再是生成许多的策略类
5、与状态模式和模板方法差异
状态模式,一般不接受新的状态对象,及状态都是已经定义好的,只会在不同状态间进行切换。策略模式侧重不同行为的改变在同一接口下,强调多态下行为的执行过程,可以接收客户参数,只要符合统一接口即可。
模板方法算法在基类中,子类只是改变算法的一部分,整体不会改变,可节省大量代码。策略模式整个算法都在子类中,是程序更加灵活。
6、总结
- StrategyInterface类及其子类提供一系列可重用的算法,从而可以在运行时根据需要,方便的在各个算法之间进行切换。
- 策略模式提供了不用条件判断语句以外的方法,即达到解耦的方式。含有大量条件语句的代码通常都需要使用策略模式
- 如果对象没有实例变量那么各个上下文可以共享同一个策略对象,可以节省对象开销。