JavaScript设计模式(三) - 策略模式
什么是策略模式?
策略模式支持在运行时由使用者选择合适的算法,对于使用者而言不用关心背后的具体实现,由使用者自动根据当前程序执行的上下文和配置,从已有的算法列列表中选择出合适的算法来处理当前任务。

上面的两个例子就是策略模式,比如根据选择的刷子的种类不同,我们可以刷出不同样式的线条出来,但是各种刷子背后的实现机制我们并不需要关心,我们只需要关心当前图中需要应用哪种刷子可以完成任务。 商品类似。
为什么要使用策略模式?
通过使用策略模式,我们可以很好地解决调用和需要调用的算法的耦合、增强可扩展性、可维护性等。
如何实现策略模式?
对于策略模式,最为常用的场景就是 --- 表单验证。
通常对于一个表单,各个字段的输入值可能格式不一,电话号码、密码、邮箱,使用数字、字符等等,多个字段还要验证非空,一般而言,我们的实现方式可能是十几个甚至几十、上百个if、else,但是这样看上去验证函数会非常冗余。 这时,我们可以吧常见的验证策略抽象为一个策略集合,使用者需要对表单数据进行校验时,只需要传入数据以及指定各个字段的验证策略,就可以给出相应的验证结果了。
我们期望这样的调用:
// 待校验的数据
var data = {
name: ' 王 x',
gender: ,
identity: '',
birthday: '1988-13-01',
mobile: '',
spareMobile: '',
email: 'abcdef.cn'
}; // 校验规则配置
validator.config = {
name: {
text: ' 姓名 ',
validators: ['isNotEmpty', 'isValidName']
},
identity: {
text: ' 身份证号 ',
validators: ['isNotEmpty','isValidIdentity']
},
birthday: {
text: ' 生日 ',
validators: [['isBirthEqualTo','identity'],'isValidDate']
},
mobile: {
text: ' 手机号码 ',
validators: ['isValidMobile']
},
spareMobile: {
text: ' 备用手机号码 ',
validators: ['isValidMobile', ['isNotEqualTo', 'mobile']]
},
email: {
text: 'Email',
validators: ['isValidEmail']
}
}; // 调用获得校验结果
validator.validate(data);
if(validator.hasErrors()){
validator.messages.join('<br/>');
}
// 期望结果:
/*
姓名只能为 2-4 个字的汉字
生日与身份证号不一致,请修改
生日格式不合法,请按 "2008-01-01" 格式输入日期
备用手机号码不得与手机号码相同,请重新输入
Email 格式不合法,请输入正确的 Email 地址
*/
那么,下面我们就看看如何实现这样的validator对象 --- 针对每种校验策略,我们需要指定校验方法和校验失败时的错误提示,这些策略可以挂载到validator对象内部方便管理:
// 所有可用的校验
validator.types = { isNotEmpty: {
validate: function(value){
return value !== "";
},
message: " 不得为空 "
}, isNotEqualTo: {
validate: function(data, curField, compareField){
return data[curField] === data[compareField];
},
message: function(fieldText){
return " 不得与 " + fieldText + " 相同,请重新输入 ";
}
}, isValidName: {
validate: function(value){
return /^[\u4e00-\u9fa5]{,}$/.test(value);
},
message: " 只能为 2-4 个字的汉字 "
}, ... };
这样,以后,每次出现了需要验证的新的策略,我们就只需要将之添加到validator.types下面,然后在validator.config中添加校验规则,代码其他部分就不需要再进行调整了,依然执行validator.validate方法。
JavaScript设计模式(三) - 策略模式的更多相关文章
- 从ES6重新认识JavaScript设计模式(三): 建造者模式
1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...
- JavaScript设计模式之策略模式(学习笔记)
在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...
- JavaScript设计模式(策略模式)
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换.将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来 ...
- 第二章 --- 关于Javascript 设计模式 之 策略模式
这一章节里面,我们会主要的针对JavaScript中的策略模式进行理解和学习 一.定义 策略模式: 定义一系列的算法,把他们封装起来,并且是他们可以相互替换. (这样的大的定义纲领,真的不好理解,特别 ...
- JavaScript设计模式之策略模式
所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...
- JavaScript设计模式_02_策略模式
在程序设计中,我们常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现.这些算法灵活多样,而且可以随意互相替换.这种解决方案就是所谓的策略模式. /* * pre:策略模式 * 示例:公司计算奖 ...
- 再起航,我的学习笔记之JavaScript设计模式20(策略模式)
策略模式 策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端变化而变化. 其实策略模式在我们生活中可应用的地方还是比较多的,比如在商 ...
- javascript设计模式:策略模式
前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...
- JavaScript设计模式之策略模式【组合委托】
前言:语言只是工具,思想才是核心 今天要总结的是 策略模式 策略在开发中的应用非常广泛,所以也是非常常见且使用的设计模式. 在实际开发中,往往在实现一个功能时,有多种解决方案可行. 常见场景: 解压: ...
- JS 设计模式三 -- 策略模式
策略模式 概念 定义一系列算法,把它们一个个封装起来. 将算法的使用与算法的实现分离开来 实现 // 加权映射关系 var levelMap = { S: 10, A: 8, B: 6, C: 4 } ...
随机推荐
- Chrome Console API 参考
https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference
- Npoi List DataTable导出一个Excel多个sheet 下载
参考: http://blog.csdn.net/zhouqinghe24/article/details/8649346 参考下载http://www.cnblogs.com/dyllove98/a ...
- 咏南中间件+开发框架支持最新的DELPHI 10.2 TOKYO
咏南中间件+开发框架支持最新的DELPHI 10.2 TOKYO 价格十分优惠.有意者请向本人索取演示程序! 你只需花一套中间件的价格,就可获得:中间件,CS开发框架一套(赠送),BS开发框架一套(赠 ...
- Asp.NetCore Razor 模式 Web 应用
Razor 页面是 ASP.NET Core MVC 的一个新功能,它可以使基于页面的编码方式更简单高效. Razor 页面是 ASP.NET Core 2.0 中的一个新选择,它是基于页面的编程模型 ...
- ajax 的前进 后退 问题 jquery.history
本文的前提是基于后台的,所以这里不会考虑seo的问题.同时,基于后台的管理系统,也不需要被收藏,所以也不会考虑刷新的这种类似直接敲网址的情况!!! 这里使用的是html5中的history.state ...
- MSP430 G2553 LaunchPad GPIO中断
P1.P2端口上的每个管脚都支持外部中断.P1端口的所有管脚都对应同一个中断向量(Interrupt Vector),类似的,P2端口的所有管脚都对应另一个中断向量:通过PxIFG寄存器来判断中断来源 ...
- WP8启动您已发布的应用
您可以使用来自 Windows.Phone.Management.Deployment 命名空间的 API 来确定,来自您的发布者 ID 的其他应用是否安装在手机上.如果已经安装,您也可以使用该 AP ...
- shell中调用jenkins API批量运行历史任务
shell中调用jenkins API批量运行jenkins带参数的任务: #!/bin/sh #startdate=20150127 startdate=20150201 while [ " ...
- SQL datediff()函数 时间差
定义和用法 DATEDIFF() 函数返回两个日期之间的天数. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 enddate 参数是合法的日期 ...
- WPF 触摸屏多点触控图像的缩放旋转和移动
<dxc:DXWindow xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:d ...