定义:Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组 算法,将每个算法都封装起来,并且使它们之间可以互换。)
策略模式的优点
算法可以自由切换 这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封 装角色对其进行封装,保证对外提供“可自由切换”的策略。
避免使用多重条件判断 如果没有策略模式,我们想想看会是什么样子?一个策略家族有5个策略算法,一会要 使用A策略,一会要使用B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维 护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略 家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。
扩展性良好 这甚至都不用说是它的优点,因为它太明显了。在现有的系统中增加一个策略太容易 了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件,这大大地符 合了OCP原则。
策略模式的缺点
策略类数量增多 每一个策略都是一个类,复用的可能性很小,类数量增多。
所有的策略类都需要对外暴露 上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则是相违 背的,我只是想使用了一个策略,我凭什么就要了解这个策略呢?那要你的封装类还有什么 意义?这是原装策略模式的一个缺点,幸运的是,我们可以使用其他模式来修正这个缺陷, 如工厂方法模式、代理模式或享元模式。
使用场景
多个类只有在算法或行为上稍有不同的场景。
算法需要自由切换的场景。 例如,算法的选择是由使用者决定的,或者算法始终在进化,特别是一些站在技术前沿 的行业,连业务专家都无法给你保证这样的系统规则能够存在多长时间,在这种情况下策略 模式是你最好的助手。
需要屏蔽算法规则的场景。 现在的科技发展得很快,人脑的记忆是有限的(就目前来说是有限的),太多的算法你 只要知道一个名字就可以了,传递相关的数字进来,反馈一个运算结果,万事大吉。
扩展:利用策略模式完成一个简单计算的开发
策略枚举方式:
策略枚举是一个非常优秀和方便的模式,但是它受枚举类型的限制,每个枚举项 都是public、final、static的,扩展性受到了一定的约束,因此在系统开发中,策略枚举一般 担当不经常发生变化的角色。
策略模式可以消除多重if判断