轻松掌握JavaScript策略模式


Posted in Javascript onAugust 25, 2016

定义:定义一系列的算法,把它们一个个封装成函数,也可把它们作为属性统一封装进一个对象,然后再定义一个方法,该方法可根据参数自动选择执行对应的算法。 

一般用于在实现一个功能时,有很多个方案可选择的情况。 

例子1:根据员工薪水salary、绩效等级S、A、B、C,来计算年终奖

//封装了所有算法的策略对象
var strategies = {
  'S': function(salary){
    return salary*4;
  },
  'A': function(salary){
    return salary*3;
  },
  'B': function(salary){
    return salary*2;
  },
  'C': function(salary){
    return salary*1;
  }
} //定义自动选择算法的方法
var calculateBonus = function(level,salary){
  return strategies[level](salary);
}
//使用
calculateBonus('S',9000); //36000
calculateBonus('B',5000); //10000

例子2:表单验证

//定义验证算法的策略对象
var strategies = function(){
  isEmpty:function(value,errorMsg){
    if(value = ''){
      return errorMsg;
    }
  }
  outRangle:function(value,min,max,errorMsg){
    if(value.length > max || value.length < min){
      return errorMsg;
    }
  }
  isSame:function(oldValue,newValue,errorMsg){
    if(newValue !== oldValue){
      return errorMsg;
    }
  }
  isMobile:function(value,errorMsg){
    if(!/(^1[3|5|8][0-9]{9}$)/.test(value)){
      return errorMsg;
    }
  }
  ......
}

也可不定义以下的Validator类,直接在触发失去焦点事件时调用strategies对象的属性方法来验证当前input项

//定义Validator
var Validator = function(){
  this.cache = [];
}
Validator.prototype.add = function(elem,rules){
  var self = this;
  for(var i = 0, rule; rule = rules[i++]){
    (function(rule){
      var strategyAry = rule.strategy.split(':');
      var errorMsg = rule.errorMsg;
      self.cache.push(function(){
        var strategy = strategyAry.shift();
        strategyAry.unshift(elem.value);
        strategyAry.push(errorMsg);
        return strategies[strategy].apply(elem,strategyAry);
      })
    })(rule)
  }
}
Validator.prototype.start = function(){
  for(var i = 0, func; func = this.cache[i++]){
    var errorMsg = func();
    if(errorMsg){
      return errorMsg;
    }
  }
}

使用:

var validator = new Validator();
validator.add(elem.userName,[
  {strategy:'isEmpty', errorMsg:'用户名不能为空'},
  {strategy:'outRangle:6:12', errorMsg:'用户名长度为6-12位'}
]);
......
var errorMsg = validator.start();
......

附:参数配置对象 
假如有一个函数foo(a,b,c,d,e,f...),它的参数很多,这样的函数不好使用,参数不好记!比较好的方法是使用一个对象来包含这些参数,然后再把该对象传递给函数,函数再对这个对象的属性做处理

var prop = {
  a:55,
  b:'ss',
  c:function(){...}
  d:{x:1,y:2}
  ...
}
foo(prop);

这样一来,使用函数时就不必去记参数顺序了,只需记住参数对象的几个属性名字就行,不易出错 
参考文献: 《JavaScript模式》 《JavaScript设计模式与开发实践》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于Jquery与WebMethod投票功能实现代码
Jan 19 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
返回上一页并自动刷新的JavaScript代码
Feb 19 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
Jul 04 Javascript
JS获取当前页面名称的简单实例
Aug 19 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 Javascript
JavaScript数组去重算法实例小结
May 07 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
微信小程序开发之转发分享功能
Oct 22 Javascript
Electron实现应用打包、自动升级过程解析
Jul 07 Javascript
uni-app实现获取验证码倒计时功能
Nov 01 Javascript
Javascript 6里的4个新语法
Aug 25 #Javascript
Javascript实现代码折叠功能
Aug 25 #Javascript
深入浅出ES6之let和const命令
Aug 25 #Javascript
PhotoSwipe异步动态加载图片方法
Aug 25 #Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 #Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 #Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
Aug 25 #Javascript
You might like
最省空间的计数器
2006/10/09 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python实现决策树分类
2018/08/30 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
python计算二维矩形IOU实例
2020/01/18 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
python之语音识别speech模块
2020/09/09 Python
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
父亲生日宴会答谢词
2014/01/10 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
教师节横幅标语
2014/10/08 职场文书
办公室主任岗位职责
2015/01/31 职场文书
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
选购到合适的激光打印机
2022/04/21 数码科技