什么是策略模式?

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

  

 上面的两个例子就是策略模式,比如根据选择的刷子的种类不同,我们可以刷出不同样式的线条出来,但是各种刷子背后的实现机制我们并不需要关心,我们只需要关心当前图中需要应用哪种刷子可以完成任务。 商品类似。

为什么要使用策略模式?

 通过使用策略模式,我们可以很好地解决调用和需要调用的算法的耦合、增强可扩展性、可维护性等。

 

如何实现策略模式?

  对于策略模式,最为常用的场景就是 --- 表单验证

  通常对于一个表单,各个字段的输入值可能格式不一,电话号码、密码、邮箱,使用数字、字符等等,多个字段还要验证非空,一般而言,我们的实现方式可能是十几个甚至几十、上百个if、else,但是这样看上去验证函数会非常冗余。 这时,我们可以吧常见的验证策略抽象为一个策略集合,使用者需要对表单数据进行校验时,只需要传入数据以及指定各个字段的验证策略,就可以给出相应的验证结果了。 

  我们期望这样的调用:

// 待校验的数据
var data = {name: ' 王 x',gender: 1,identity: '011110198806061234',birthday: '1988-13-01',mobile: '15800000000',spareMobile: '13911111111',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]{2,4}$/.test(value);},message: " 只能为 2-4 个字的汉字 "},...};

这样,以后,每次出现了需要验证的新的策略,我们就只需要将之添加到validator.types下面,然后在validator.config中添加校验规则,代码其他部分就不需要再进行调整了,依然执行validator.validate方法。

JavaScript设计模式(三) - 策略模式相关推荐

  1. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composi ...

  2. JavaScript版本的策略模式

    俗话说,条条大路通罗马.在美剧<越狱>中,主角Michael Scofield就设计了两条越狱的道路.这两条道路都可以到达靠近监狱外墙的医务室. 同样,在现实中,很多时候也有多种途径到达同 ...

  3. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  4. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  5. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  6. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  7. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  8. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  9. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  10. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. 下列哪个可以选中矩形文字块_AI制作字母块文字效果
  2. 记事本 换行符_30年后终更新!新一代Win10记事本详细体验
  3. Dsp BootLoader的学习
  4. db2数据备份到mysql_DB2数据库自动备份详解
  5. matlab 安装jdbc.jar
  6. 计算机二级安装64位的还是,电脑操作系统安装,该选择32位还是64位?
  7. 使 32 位程序使用大于 2GB 的内存
  8. 计算机常见软件故障有哪几种,计算机常见故障可分为硬件和软件故障,具体介绍...
  9. 2022-2027年中国医疗行业市场深度分析及投资战略规划报告
  10. html文本框设置大小,css怎么设置文本框大小
  11. 【上班摸鱼系列】文字选择类游戏:《职员默示录 - 启》末日丧尸爆发,你,是什么下场!?...
  12. 003.宋浩老师《线性代数》笔记(第二章矩阵)(二)
  13. 剑客之剑——倚天剑(Vim)
  14. 201521123091 《Java程序设计》第11周学习总结
  15. 史上最全的中高级JAVA工程师-面试题汇总
  16. linux制作deepin启动盘制作工具,深度启动盘制作工具(Deepin Boot Maker)下载_深度启动盘制作工具(Deepin Boot Maker)官方下载-太平洋下载中心...
  17. GO语言基础----简易计算器
  18. 从零破解一款轻量级滑动验证码
  19. Objective-c中的占位符,打印BOOL类型数据
  20. R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图

热门文章

  1. PathFileExists用法--使用#include shlwapi.h
  2. ZooKeeper 集群
  3. Java判断字符串是否为正整数且不能以0开头
  4. Gridea主题 Phantom
  5. 大数据:商业竞争的“定海神针”
  6. 02【Verilog实战】异步FIFO设计(附源码RTL/TB)
  7. 解决:操作无法完成(错误0x00000709)。再次检查打印机名称,并确保打印机已连接到...
  8. 志玲姐姐与程序运行杂谈
  9. java httpclient 关闭_HttpClient关闭连接
  10. 机器学习(周志华) 第十二章计算学习理论