轻松掌握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 相关文章推荐
lyhucSelect基于Jquery的Select数据联动插件
Mar 29 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
Aug 02 Javascript
关于jquery的多个选择器的使用示例
Oct 18 Javascript
jquery插件jTimer(jquery定时器)使用方法
Dec 23 Javascript
jquery处理json数据实例分析
Jun 03 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
Jan 08 Javascript
浅谈js数据类型判断与数组判断
Aug 29 Javascript
js Element Traversal规范中的元素遍历方法
Apr 19 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
Apr 22 Javascript
详解微信小程序支付流程与梳理
Jul 16 Javascript
Vue-CLI与Vuex使用方法实例分析
Jan 06 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 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下将XML转换为数组
2010/01/01 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
python中kmeans聚类实现代码
2018/02/23 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
python logging设置level失败的解决方法
2020/02/19 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
java程序员面试交流
2012/11/29 面试题
汽车销售求职自荐信
2013/10/01 职场文书
优秀教师获奖感言
2014/01/31 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
护士2014年终工作总结
2014/11/11 职场文书
高一军训决心书
2015/02/05 职场文书
美术教师个人工作总结
2015/02/06 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
小学运动会通讯稿
2015/07/18 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
MySQL 计算连续登录天数
2022/05/11 MySQL