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 } ...
随机推荐
- UVa 11136 Hoax or what (STL)
题意:有 n 天,每天有m个数,开始的前一天没有数据,然后每天从这个里面拿出一个最大的和最小的,求 n 天的最大的和最小的差值相加. 析:一看就知道用set啊,多简单的STL,不过要注意,开long ...
- HDU 1286 找新朋友 (欧拉phi函数打表)
题意:你懂得. 析:一看这个题应该是欧拉phi函数,也就说欧拉phi函数是指求从 1 到 n 中与 n 互素的数的个数,这个题很明显是这个意思嘛,不多说了. 代码如下: #include <io ...
- 安装完 swoole 后出现 PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so'的解决方法
安装完 swoole 后出现 PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so' (tried: /home/s ...
- CLOB 和 BLOB
An SQL CLOB is a built-in type that stores a Character Large Object as a column value in a row of a ...
- idea jvm 优化
修改对应配置文件 64位的是idea64.exe.vmoptions -Xms2048m -Xmx2048m -Xmn1024m -XX:PermSize=512m -XX:MaxPermSize=5 ...
- rzdatetimepicker
两项选为True时可显示今天和圆圈 此属性可使右边按钮下平滑 注意Format中的表示月份的MM一定要大写,不然修改时和分钟会联动.
- Sourcetree拉取推送问题
以下sourcetree使用时出现的问题:可以暂时用删除passwd文件解决 拉取时账号密码输入错误 已经有一个远程仓库了,但是需要拉取另一个远程仓库时,提示URL 进入 C:\Users\用户名\A ...
- 开源一款强大的文件服务组件(QJ_FileCenter)(系列二 安装说明)
系列文章 1. 开源一款强大的文件服务组件(QJ_FileCenter)(系列一) 2. 开源一款强大的文件服务组件(QJ_FileCenter)(系列二 安装说明) 3. 开源一款强大的文件服务组件 ...
- asp.net mvc全局异常捕获
通过重写OnException方法形式实现. 1.自定义异常记录类并继承HandleErrorAttribute类. public class HandlerErrorAttribute : Hand ...
- c语言------第一次作业,分支,顺序结构
1.1思维导图 1.2本章学习体会及代码量学习体 1.2.1学习体会 初次接触C语言,由于比较懒惰,感觉学习脚步跟不上身边的同学,也比较困扰.但伴随着pta上多次显示的##编译错误##,坚持不懈地问舍 ...