再起航,我的学习笔记之JavaScript设计模式20(策略模式)
来源:互联网 发布:excel数据的分类汇总 编辑:程序博客网 时间:2024/04/24 09:46
策略模式
策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定的独立性,不会随客户端变化而变化。
其实策略模式在我们生活中可应用的地方还是比较多的,比如在商城搞促销的时候,会有很多打折的情况比如5折呀,7折呀,还会有各种返利,比如满200-100这类的活动,这种场景,我们的策略模式就可以应用上去
示例演示
//创建折扣策略对象var DiscountStrategy = function() { //创建内部算法对象 var stragtegy = { rebate30: function(price) { return price - parseInt(price / 100) * 30; }, rebate50: function(price) { return price - parseInt(price / 100) * 50; }, discount90: function(price) { return price * 100 * 90 / 10000 }, discount80: function(price) { return price * 100 * 80 / 10000 }, discount50: function(price) { return price * 100 * 50 / 10000 } } //策略算法调用接口 return { returnPrice: function(algorithm, price) { return stragtegy[algorithm] && stragtegy[algorithm](price); }, ,//添加策略 addStrategy: function(type, fn) { stragtegy[type] = fn; } }}();
我们看一下具体的调用,另外我们之前添加了拓展策略的方法,我们一并测试下
var price = DiscountStrategy.returnPrice('discount50', '210');console.log(price);//添加新策略DiscountStrategy.addStrategy('discount70', function(price) { return price * 100 * 70 / 10000})price = DiscountStrategy.returnPrice('discount70', '210');console.log(price);
从结构上看,策略模式和状态模式很像,也是在内部封装一个对象,然后通过返回的接口对象实现对内部对象的调用,但是策略模式不需要管理状态、状态间没有依赖关系。策略之间可以相互替换、在策略对象内部保存的是相互独立的一些算法。
让我们再看一个我们实际场景可以应用的验证例子
实例演示
//表单正则验证策略对象var checkInput = function() { var stragtegy = { //判断是否为空 notNull: function(value) { return /\s/.test(value) ? '请输入内容' : ''; }, //判断是否为一个数字 number: function(value) { return /^[0-9]+(\.[0-9]+)?$/.test(value) ? '' : '请输入数字' } } return { //验证接口 check: function(type, value) { value = value.replace(/^\s+|\s+$/g, ''); return stragtegy[type] ? stragtegy[type](value) : '没有该类型的检测方法' }, //添加策略 addStrategy: function(type, fn) { stragtegy[type] = fn; } }}();
同样的我们调用测试下
console.log(checkInput.check('number', 'a'));console.log(checkInput.check('number', '0'));checkInput.addStrategy('phone', function(value) { return /^\d{3}\-\d{8}$|^\d{4}-\d{7}$/.test(value) ? '' : '请输入正确的电话号码';})console.log(checkInput.check('phone', '12345678'));console.log(checkInput.check('phone', '027-12345678'));
总结
策略模式最主要的特点是创建一系列策略算法,没组算法处理的业务都是相同的,只是处理的过程或者处理的结果不一样,所以它们又是可以相互替换的,这样就解决了算法与使用者之间的耦合。在测试层面上讲,由于每组算法相互之间的独立性,该模式更方便与每组算法进行单元测试保证算法的质量。
策略模式的优点
- 策略模式封装了一组代码簇,并且封装的代码相互之间独立,便于对算法的重复引用,提高了算法的复用率。
- 策略模式与继承相比,在类的继承中继承的方法是被封装在类中,因此当需求很多算法时,就不得不创建出多种类,这样会导致算法与算法的使用者耦合在一起,不利于算法的独立演化,并且在类的外部改变类的算法难度也是极大的。
- 同状态模式一样,策略模式也是一种优化分支判断语句的模式,采用策略模式对算法封装使得算法更利于维护。
策略模式的缺点
- 由于选择算法的决定权在用户,所以用户就必须了解每种算法的实现,这样就增加了用户对策略模式的使用成本。
由于每种算法都相互独立,这样对于一些复杂的算法处理相同的逻辑部分无法实现共享,就会造成资源浪费(我们可以用襄垣模式来解决)。
阅读全文
0 0
- 再起航,我的学习笔记之JavaScript设计模式20(策略模式)
- 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)
- 再起航,我的学习笔记之JavaScript设计模式12(适配器模式)
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
- 再起航,我的学习笔记之JavaScript设计模式16(享元模式)
- 再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)
- 再起航,我的学习笔记之JavaScript设计模式18(观察者模式)
- 再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)
- 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- (学习笔记)设计模式之策略模式
- 设计模式学习笔记之策略模式
- 技术文章 | Android Webview场景下防止dns劫持的探索
- Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp 忽略了剩余行默认分类
- 【玖哥乱弹】祭天时不同程序员的不同杀法
- codewars-5kyu-Simple Pig Latin:正则表达式的使用
- python之闭包函数 装饰器 练习
- 再起航,我的学习笔记之JavaScript设计模式20(策略模式)
- 用nodejs 写一个 jvm
- jstl标签(jsp标准标签库)
- js动态添加点击事件
- 关于gethostbyname_r调用后是否会有内存泄漏问题?
- Docker-Compose服务编排
- JS的this总结(上)-call()和apply()
- 在Visual Studio 2017中打开DirectX
- JAVA自定义二维码