【设计模式】策略模式

原创 lingwer111 随笔 JavaScript 169阅读 2017-05-13 13:35:08 举报

定义
定义一系列的算法,把他们一个个封装起来,并使得他们可以相互替换。
前言
俗话说条条大路通罗马,我们到底一个目的地,可以有很多选择,坐飞机,大巴,火车。自行车甚至走路。在程序设计中,我们也常常遇到类似的情况。要实现某个功能由多钟方案可以选择。比如压缩一个文件的程序,可以选择zip算法,也可以选择gzip算法。

很多公司的年终奖是根据工资基数和年底绩效情况来发放的。例如绩效为S的人年终奖有4倍工资。绩效为A的有3倍工资。以此类推,假设要写一段代码来方便计算年终奖。
最初的代码实现。
javascript 代码

可以发现这段代码十分简单,但缺点也显而易见。
1,count函数会有很多if-else语句。
2,缺乏弹性,如果要增加一种绩效等级为SS,奖金系数改为5倍、就必须深入count函数内部实现。这违反开放-封闭原则。
3.复用性差。假设在程序的其他地方需要重用计算奖金的算法呢。

下面用策略模式来重写上面的代码。
html 代码

可以看到上面的函数,我们消除了源程序中大片的分之语句,所有跟计算奖金的逻辑不再放在Context(环境)中。而是分布在各个策略对象中。由Context调用策略对象。当我们队这些策略对象发出 计算奖金的请求时,他们会返回不同的计算结果,这是对象多态性的体现。也是‘他们可以相互替换’的目的。

用策略模式实现缓冲动画。
要实现动画,首先要了解一下常见的缓动算法,下面这些算法最初来着Falsh,但可以非常方便的移植到其他语言中。
javascript 代码

下面是完整的代码实现
html 代码

以上的代码中,体现策略模式的地方就是输入算法单独出来一个函数,一目了然,方便复用。在Animate类中,传入需要的算法名字,就调用相应算法。

下面再来个表单验证。这是常见的场景
html 代码

策略模式的优缺点
策略模式是一种常用且有效的设计模式,本章提供了计算奖金、缓动动画、表单校验这三个例子来加深大家对策略模式的理解。从这三个例子中,我们可以总结出策略模式的一些优点。
 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。
 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的 strategy 中,使得它们易于切换,易于理解,易于扩展。
 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。
 在策略模式中利用组合和委托来让 Context 拥有执行算法的能力,这也是继承的一种更轻便的替代方案。
当然,策略模式也有一些缺点,但这些缺点并不严重。
首先,使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把它们负责的逻辑堆砌在 Context 中要好。
其次,要使用策略模式,必须了解所有的 strategy,必须了解各个 strategy 之间的不同点,这样才能选择一个合适的 strategy。比如,我们要选择一种合适的旅游出行路线,必须先了解选
择飞机、火车、自行车等方案的细节。此时 strategy 要向客户暴露它的所有实现,这是违反最少知识原则的。
小结
本章我们既提供了接近传统面向对象语言的策略模式实现,也提供了更适合 JavaScript 语言
的策略模式版本。在 JavaScript 语言的策略模式中,策略类往往被函数所代替,这时策略模式就
成为一种“隐形”的模式。尽管这样,从头到尾地了解策略模式,不仅可以让我们对该模式有更
加透彻的了解,也可以使我们明白使用函数的好处。
参考《JavaScript设计模式与开发实践》

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复