关于设计模式:精读设计模式-Strategy-策略模式

23次阅读

共计 1550 个字符,预计需要花费 4 分钟才能阅读完成。

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 许可证)

正文完
 0