开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
动机(Motivation)
在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
模式定义
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
——《设计模式》GoF
结构(Structure)
要点总结
Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。
笔记
以一个实际场景为例:计算各国的tax
如果在基类中使用if-else判断各国的tax计算公式,那么一旦出现新的国家
就需要重新修改基类文件的代码
这样具有不好的地方:
- 改动基类后,文件需要重新编译(但是我们希望尽量只编译新增的部分)
- 在一些场景下,一些if-else中的函数并不会大量的使用,但是也会进入编译器进行编译,占用空间
所以我们希望:不修改基类代码,遵循拓展而不是修改的原则,使用继承的方式完成。这样对于新国家的tax计算我们只需要在新的一个文件中实现即可,不需要修改原基类代码(也就需要再编译基类了)。
所以策略模式就是指在运行时根据需要透明地更改对象的算法,将算法与对象本身解耦。
结语
文章仅作为个人学习笔记记录,记录从0到1的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正