一、定义
策略模式定义了一系列算法,把它们一个个封装起来,并且可以使它们可相互替换(变化)。该模式使得算法可独立于使用它的客户端程序(稳定)而变化。
二、结构
Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需求在各个算法之间进行切换。
Strategy模式提供了用条件判断语句(if/else)以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常要考虑Strategy模式。
if/else 是一种结构化分而治之的设计,当未来需求有变化时不能更好地应对,违反了开闭原则,需要以扩展的形式支持未来的变化。因此可以考虑使用面向对象的抽象设计。
但在一些if else绝对不变的情况下,不一定要使用Strategy,如:性别、一周有7天等等情况。
支持不是用的算法(代码)会增加性能负担,有很大段代码被装载到代码段中,却不被使用。而Strategy通常在运行时加载到内存,(代码本地化)最好加载到cpu的高级缓存中。若代码过长则有些需要加载到主存中,甚至需要放到硬盘。
如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。(单例模式)