关键词:
在开篇之前先分享今天看到的一句关于设计模式的话:将不变的部分和变化的部分隔开是每个设计模式的主题
请大家自行感受这句话的精髓所在,并且思考学习设计模式究竟能给我们编程带来什么样的东西,欢迎大家在文章下面评(chui)论(shui),分享自己的宝贵见解。好了,回到今天的正题,JavaScript实现策略模式。
什么是策略模式
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互转换。讲人话就是:我想去旅游,那么我可以选择不同的方法(策略)去达到我的目的——旅游。比如说坐飞机,走路,甚至是小黄车ofo都行,这看你具体是怎么选择。如果你想快一点,那就选择坐飞机,如果你有梦想,那就选择走路,不管你选择什么,最后你都能达到相同的目的——旅游。
策略模式思想
接合上面的例子和开篇第一句话,在策略模式中,不变的是我们的目的——旅游,而变化的部分是我们的去的方式(坐飞机,走路,ofo),所以我们就要把这两部分隔开以实现解耦。也就是策略模式的目的所在。为了比较策略模式带来的好处,我先用一般的方式完成我上面的例子。请看代码:
var travel = function(transportation, destination) { if(transportation == 'plane') { console.log("乘坐飞机到" + destination + "啦"); } if(transportation == 'foot') { console.log("走路到" + destination + "啦"); } if(transportation == 'ofo') { console.log("骑小黄车到" + destination + "啦"); } } travel("foot", "北京"); //控制台打印:走路到北京啦 travel("ofo", "天堂"); //控制台打印:骑小黄车到天堂啦
我们现在已经完成了旅游的代码,貌似不错哦。但是恕我直言,这就是一段辣鸡代码。嘻嘻,具体有如下原因:
1、travel函数包含了很多if语句,这些语句需要覆盖所有的逻辑分支
2、travel函数缺乏弹性,如果现在又多了一种交通工具小蓝车,我们就必须修改travel函数源代码,这不科学!属实是违反了开放-封闭原则。
现在我们使用策略模式来优化这段代码,请看下面代码:
var strategies = { plane: function (destination) { console.log("乘坐飞机到" + destination + "啦"); }, foot: function (destination) { console.log("走路到" + destination + "啦"); }, ofo: function (destination) { console.log("骑小黄车到" + destination + "啦") } } var travel = function (transportation, destination) { strategies[transportation](destination); } travel("foot", "北京"); travel("ofo", "天堂");
执行结果如下:
可以看到我们通过策略模式完成了我们的需求,并且如果以后多了交通工具,管它是小黄车小白车还是小黑车,我们只用在策略对象strategies添加新的配置就可以了,而不用改动我们的travel函数。
再次回顾开篇第一句话:将不变的部分和变化的部分隔开是每个设计模式的主题
结合我们的策略模式思考,策略模式不变的部分就是目的(上例旅游),变化的部分就是过程(交通工具和目的地)。通过策略模式我们把这两部分彻底解耦,我们的过程(strategies)变化了也不会影响到我们的目的(travel)。我认为这就是策略模式给我们带来的好处。
javascript设计模式之策略模式(代码片段)
概念基本定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式指的是定义一系列的算法,把它们一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,... 查看详情
《javascript设计模式与开发实践》——策略模式
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 (1)使用策略模式计算奖金经过思考,我们想到了更好的办法——使用策略模式来重构代码。策略模式指的是定义一系列的算法... 查看详情
javascript设计模式-策略模式
策略模式笔记 将定义的一组算法封装起来,使其相互之间可以替换。 封装的算法具有一定独立性,不会随客户端变化而变化。 与状态模式异同? 1.结构上看,它与状态模式很像,也是在内... 查看详情
javascript设计模式策略模式
在现实中,我们到达一个地方,通常可以选择不同的方式,例如自行车,火车,汽车,飞机等。在程序设计中,通常也会有这样的情况,实现一个功能有多个方案可以选择,比如一个压缩文件的程序,既可以选择zip算法,也可以... 查看详情
javascript设计模式--行为型--设计模式之strategy策略模式(21)(代码片段)
JAVASCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVASCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVASCRIPT代码,代码只是实现了... 查看详情
javascript设计模式与开发实践阅读笔记——策略模式
策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数。这样做的好处是可以消化掉内部的分支判断,使代码效率更... 查看详情
javascript设计模式之策略模式(代码片段)
概念基本定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式指的是定义一系列的算法,把它们一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,... 查看详情
javascript设计模式--行为型--设计模式之strategy策略模式(21)(代码片段)
JAVASCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVASCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVASCRIPT代码,代码只是实现了... 查看详情
javascript设计模式中策略模式的使用方法(代码片段)
...略模式的优点改造方案一改造方法二面向对象的策略模式Javascript计算奖金版本的策略模式,策略模式定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换简单来说是:定义一系列的算法,把... 查看详情
javascript设计模式行为型设计模式--策略模式(代码片段)
俗话说“条条大路通罗马”。在现实中,很多时候也有多种途径可以到达同一个目的地,比如,我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路。在程序设计中,我们也常常遇到类似... 查看详情
javascript策略模式-而不是开关(代码片段)
javascript设计模式之策略模式
什么是设计模式?为什么需要学习设计模式?学习设计模式的目的是:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。... 查看详情
javascript设计模式总结之--策略模式
1.写设计模式系列文章的背景本系列文章主要是为了对javascript的设计模式做一个总结。各个网站中对设计模式都有介绍,也有专门的书。那么我写的原因是为了自己能够更清晰的理解,也为了对大家的学习有些不同角度的感悟。... 查看详情
《javascript设计模式与开发实践》学习之使用策略模式计算奖金
简洁的做法如下: 查看详情
代码片-策略模式+工厂模式(代码片段)
通过策略类实现不同场景的策略处理,通过工厂模式创建不同的策略对象1.策略实现接口、策略实现类1.1策略接口/***策略接口*/publicinterfaceIWarnRulepublicvoidwarn();1.2策略实现类/***防拆告警策略实现类*/publicclassAntiRemovalWarnimplements... 查看详情
代码片-策略模式+工厂模式(代码片段)
通过策略类实现不同场景的策略处理,通过工厂模式创建不同的策略对象1.策略实现接口、策略实现类1.1策略接口/***策略接口*/publicinterfaceIWarnRulepublicvoidwarn();1.2策略实现类/***防拆告警策略实现类*/publicclassAntiRemovalWarnimplements... 查看详情
代码片-策略模式+工厂模式(代码片段)
通过策略类实现不同场景的策略处理,通过工厂模式创建不同的策略对象1.策略实现接口、策略实现类1.1策略接口/***策略接口*/publicinterfaceIWarnRulepublicvoidwarn();1.2策略实现类/***防拆告警策略实现类*/publicclassAntiRemovalWarnimplements... 查看详情
代码片-策略模式+工厂模式(代码片段)
通过策略类实现不同场景的策略处理,通过工厂模式创建不同的策略对象1.策略实现接口、策略实现类1.1策略接口/***策略接口*/publicinterfaceIWarnRulepublicvoidwarn();1.2策略实现类/***防拆告警策略实现类*/publicclassAntiRemovalWarnimplements... 查看详情