轻松掌握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 相关文章推荐
JS中==与===操作符的比较
Mar 21 Javascript
javascript学习笔记(七) js函数介绍
Jun 19 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
动态创建script标签实现跨域资源访问的方法介绍
Feb 28 Javascript
js动态移动滚动条至底部示例代码
Apr 24 Javascript
浅谈Javascript中substr和substring的区别
Sep 30 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
Jul 11 Javascript
AngularJS表单和输入验证实例
Nov 02 Javascript
微信小程序 label 组件详解及简单实例
Jan 10 Javascript
探究react-native 源码的图片缓存问题
Aug 24 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 Javascript
JavaScript fetch接口案例解析
Aug 30 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
PHP操作数组相关函数
2011/02/03 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php返回json数据函数实例
2014/10/09 PHP
php使用session二维数组实例
2014/11/06 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
工作需要写的一个js拖拽组件
2011/07/28 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
JS作用域链详解
2017/06/26 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
Python随手笔记之标准类型内建函数
2015/12/02 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
关于Django外键赋值问题详解
2017/08/13 Python
Django开发的简易留言板案例详解
2018/12/04 Python
django-初始配置(纯手写)详解
2019/07/30 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
校友会欢迎辞
2014/01/13 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server