Strategy(策略模式)
Strategy(策略模式)属于行为型模式。
用意:定义一系列的算法,把它们一个个封装起来,并且使它们能够互相替换。本模式使得算法能够独立于应用它的客户而变动。
策略是个形象的表述,所谓策略就是计划,咱们都晓得任何事件都有多种计划,而且不同计划都能解决问题,所以这些计划能够互相替换。咱们将计划从问题中形象进去,这样就能够抛开问题,独自优化计划了,这就是策略模式的核心思想。
举例子
如果看不懂下面的用意介绍,没有关系,设计模式须要在日常工作里用起来,联合例子能够加深你的了解,上面我筹备了三个例子,让你领会什么场景下会用到这种设计模式。
地图导航
咱们去任何中央都能够抉择步行、骑车、开车、公交,不同的计划都能够帮忙咱们达到目的地,那么很显著应该将这些计划变成策略封装起来,接管的都是出发点和目的地,输入的都是路线。
布局形式
比方咱们做一个报表零碎,在 PC 应用珊格布局,在挪动端应用流式布局,其实内容还是那些,只是布局形式会随着不同终端大小做不同的适配,那么布局的适配就是一种策略,它能够与报表内容无关。
咱们能够将布局策略独自抽取进去,当前甚至能够适配电视机、投影仪等等不同尺寸的场景,而不须要对其余代码做任何改变,这就是将布局策略从代码中解耦进去的益处。
排序算法
当咱们调用 .sort
时,应用的是什么排序算法?可能是冒泡、疾速、插入排序?其实无论何种排序算法,实质上做的事件都是一样的,咱们能够当时将排序算法封装起来,针对不同个性的数组调用不同的排序算法。
用意解释
用意:定义一系列的算法,把它们一个个封装起来,并且使它们能够互相替换。本模式使得算法能够独立于应用它的客户而变动。
算法能够了解为策略,咱们制订许多解决某个场景的策略,这些策略都能够独立的解决这个场景的问题,这样下次遇到这个场景时,咱们就能够抉择任何策略来解决,而且咱们还能够脱离场景,独自优化策略,只有接口不变即可。
这个用意实质上就是解耦,解耦之后才能够分工。想想一个简单的零碎,如果所有策略都耦合在业务逻辑里,那么只有懂业务的人才能小心翼翼的保护,但如果将策略与业务解耦,咱们就能够独立保护这些策略,为业务带来更灵便的变动。
结构图
- Strategy: 策略公共接口。
- ConcreteStrategy: 具体策略,实现了下面这个接口。
只有你的策略合乎接口,就满足策略模式的条件。
代码例子
上面例子应用 typescript 编写。
interface Strategy {doSomething: () => void
}
class Strategy1 implements Strategy {doSomething: () => {console.log('实现计划 1')
}
}
class Strategy2 implements Strategy {doSomething: () => {console.log('实现计划 2')
}
}
// 应用
new System(new Strategy1()) // 策略 1 实现的零碎
new System(new Strategy2()) // 策略 2 实现的零碎
弊病
不要走极端,不要每个分支走一个策略模式,这样会导致策略类过多。当分支逻辑简略清晰好保护时,不须要应用策略模式形象。
总结
策略模式是很重要的抽象思维,咱们首先要意识到问题有许多种解法,能力意识到策略模式的存在。当一个问题须要采取不同策略,且策略绝对较简单,且将来可能要拓展新策略时,能够思考应用策略模式。
探讨地址是:精读《设计模式 – Strategy 策略模式》· Issue #304 · dt-fe/weekly
如果你想参加探讨,请 点击这里,每周都有新的主题,周末或周一公布。前端精读 – 帮你筛选靠谱的内容。
关注 前端精读微信公众号
版权申明:自在转载 - 非商用 - 非衍生 - 放弃署名(创意共享 3.0 许可证)