轻松掌握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 相关文章推荐
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
javascript中replace( )方法的使用
Apr 24 Javascript
js中 javascript:void(0) 用法详解
Aug 11 Javascript
js小数运算出现多位小数如何解决
Oct 08 Javascript
原生JavaScript实现异步多文件上传
Dec 02 Javascript
jQuery CSS3相结合实现时钟插件
Jan 08 Javascript
jQuery基于muipicker实现仿ios时间选择
Feb 22 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
bootstrap table配置参数例子
Jan 05 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
layer弹出层显示在top顶层的方法
Sep 11 Javascript
vue实现折线图 可按时间查询
Aug 21 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基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
学习YUI.Ext 第七天--关于View&amp;JSONView
2007/03/10 Javascript
学习ExtJS fit布局使用说明
2009/10/08 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
Python中的迭代器漫谈
2015/02/03 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
利用Python计算KS的实例详解
2020/03/03 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
Otel.com:折扣酒店预订
2017/08/24 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
教师演讲稿范文
2014/01/08 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
企业党员个人自我评价
2014/09/20 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
北京天坛导游词
2015/02/12 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
python实现简单石头剪刀布游戏
2021/10/24 Python
MySQL数据库 安全管理
2022/05/06 MySQL
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang