Strategy(策略模式)属于行为型模式。前端
意图:定义一系列的算法,把它们一个个封装起来,而且使它们能够相互替换。本模式使得算法能够独立于使用它的客户而变化。git
策略是个形象的表述,所谓策略就是方案,咱们都知道任何事情都有多种方案,并且不一样方案都能解决问题,因此这些方案能够相互替换。咱们将方案从问题中抽象出来,这样就能够抛开问题,单独优化方案了,这就是策略模式的核心思想。github
若是看不懂上面的意图介绍,没有关系,设计模式须要在平常工做里用起来,结合例子能够加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。算法
咱们去任何地方均可以选择步行、骑车、开车、公交,不一样的方案均可以帮助咱们到达目的地,那么很明显应该将这些方案变成策略封装起来,接收的都是出发点和目的地,输出的都是路线。typescript
好比咱们作一个报表系统,在 PC 使用珊格布局,在移动端使用流式布局,其实内容仍是那些,只是布局方式会随着不一样终端大小作不一样的适配,那么布局的适配就是一种策略,它能够与报表内容无关。设计模式
咱们能够将布局策略单独抽取出来,之后甚至能够适配电视机、投影仪等等不一样尺寸的场景,而不须要对其余代码作任何改动,这就是将布局策略从代码中解耦出来的好处。数组
当咱们调用 .sort
时,使用的是什么排序算法?多是冒泡、快速、插入排序?其实不管何种排序算法,本质上作的事情都是同样的,咱们能够事先将排序算法封装起来,针对不一样特性的数组调用不一样的排序算法。微信
意图:定义一系列的算法,把它们一个个封装起来,而且使它们能够相互替换。本模式使得算法能够独立于使用它的客户而变化。布局
算法能够理解为策略,咱们制定许多解决某个场景的策略,这些策略均可以独立的解决这个场景的问题,这样下次遇到这个场景时,咱们就能够选择任何策略来解决,并且咱们还能够脱离场景,单独优化策略,只要接口不变便可。优化
这个意图本质上就是解耦,解耦以后才能够分工。想一想一个复杂的系统,若是全部策略都耦合在业务逻辑里,那么只有懂业务的人才能当心翼翼的维护,但若是将策略与业务解耦,咱们就能够独立维护这些策略,为业务带来更灵活的变化。
只要你的策略符合接口,就知足策略模式的条件。
下面例子使用 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 许可证)