轻松掌握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 相关文章推荐
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
Feb 02 Javascript
jQuery中:password选择器用法实例
Jan 03 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
Sep 28 Javascript
详解vue项目的构建,打包,发布全过程
Nov 23 Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
Jul 13 jQuery
Nuxt.js开启SSR渲染的教程详解
Nov 30 Javascript
通过js给网页加上水印背景实例
Jun 17 Javascript
vue中watch和computed的区别与使用方法
Aug 23 Javascript
面试中canvas绘制图片模糊图片问题处理
Mar 13 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
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
Python实现约瑟夫环问题的方法
2016/05/03 Python
python使用KNN算法手写体识别
2018/02/01 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python散点图实例之随机漫步
2018/08/27 Python
Python中new方法的详解
2019/01/15 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
美国时尚在线:Showpo
2017/09/08 全球购物
2014端午节活动策划方案
2014/01/27 职场文书
开学典礼主持词
2014/03/19 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
2015年财政局工作总结
2015/05/21 职场文书
工作时间证明
2015/06/15 职场文书
电视新闻稿
2015/07/17 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python