精读《设计模式 - Strategy 策略模式》

Strategy(策略模式)

Strategy(策略模式)属于行为型模式。前端

意图:定义一系列的算法,把它们一个个封装起来,而且使它们能够相互替换。本模式使得算法能够独立于使用它的客户而变化。git

策略是个形象的表述,所谓策略就是方案,咱们都知道任何事情都有多种方案,并且不一样方案都能解决问题,因此这些方案能够相互替换。咱们将方案从问题中抽象出来,这样就能够抛开问题,单独优化方案了,这就是策略模式的核心思想。github

举例子

若是看不懂上面的意图介绍,没有关系,设计模式须要在平常工做里用起来,结合例子能够加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。算法

地图导航

咱们去任何地方均可以选择步行、骑车、开车、公交,不一样的方案均可以帮助咱们到达目的地,那么很明显应该将这些方案变成策略封装起来,接收的都是出发点和目的地,输出的都是路线。typescript

布局方式

好比咱们作一个报表系统,在 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 许可证
相关文章
相关标签/搜索