轻松掌握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 相关文章推荐
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
Sep 07 Javascript
一个轻量级的javascript库 pj介绍
Dec 19 Javascript
js上传图片及预览功能实例分析
Apr 24 Javascript
javascript带回调函数的异步脚本载入方法实例分析
Jul 02 Javascript
jQuery图片左右滚动代码 有左右按钮实例
Jun 20 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
May 18 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 Javascript
javascript异步编程的六种方式总结
May 17 Javascript
Vue.js标签页组件使用方法详解
Oct 19 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
Nov 12 Javascript
Vue强制组件重新渲染的方法讨论
Feb 03 Javascript
如何通过vscode运行调试javascript代码
Jul 24 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
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
Underscore源码分析
2015/12/30 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
python实现合并两个数组的方法
2015/05/16 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
艺术爱好者的自我评价分享
2013/10/08 职场文书
公司授权委托书范文
2014/08/02 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript