轻松掌握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制作LED 时钟特效
Feb 01 Javascript
js实现模拟计算器退格键删除文字效果的方法
May 07 Javascript
JS实现上下左右对称的九九乘法表
Feb 22 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
Jun 07 Javascript
JS 实现随机验证码功能
Feb 15 Javascript
如何选择适合你的JavaScript框架
Nov 20 Javascript
JS实现图片居中悬浮效果
Dec 25 Javascript
js canvas实现画图、滤镜效果
Nov 27 Javascript
JS 封装父页面子页面交互接口的实例代码
Jun 25 Javascript
Vue 实现从文件中获取文本信息的方法详解
Oct 16 Javascript
vue设置一开始进入的页面教程
Oct 28 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 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
php&amp;java(三)
2006/10/09 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
Python实现在线程里运行scrapy的方法
2015/04/07 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
Python爬取成语接龙类网站
2018/10/19 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
零基础小白多久能学会python
2020/06/22 Python
python 实现Harris角点检测算法
2020/12/11 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
服装设计行业个人的自我评价
2013/12/20 职场文书
三八妇女节慰问信
2015/02/14 职场文书
党章学习心得体会2016
2016/01/14 职场文书
muduo TcpServer模块源码分析
2022/04/26 Redis
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python