轻松掌握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 相关文章推荐
location.search在客户端获取Url参数的方法
Jun 08 Javascript
js 浏览器事件介绍
Mar 30 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
Feb 13 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
Dec 14 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
Jan 31 Javascript
Sequelize中用group by进行分组聚合查询
Dec 12 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
Vue.js在数组中插入重复数据的实现代码
Nov 17 Javascript
微信小程序wepy框架笔记小结
Aug 08 Javascript
JS左右无缝轮播功能完整实例
May 16 Javascript
js实现for循环跳过undefined值示例
Jul 02 Javascript
浅谈vue-props的default写不写有什么区别
Aug 09 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
NOT NULL 和NULL
2007/01/15 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
深入php面向对象、模式与实践
2016/02/16 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
python交互式图形编程实例(一)
2017/11/17 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
打架检讨书300字
2014/02/02 职场文书
2014年行政部工作总结
2014/11/19 职场文书
申报材料格式
2014/12/30 职场文书
计划生育个人总结
2015/03/02 职场文书
专家推荐信范文
2015/03/26 职场文书
培训通知书模板
2015/04/17 职场文书
培训计划通知
2015/07/15 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
聊聊Python String型列表求最值的问题
2022/01/18 Python
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
java版 联机五子棋游戏
2022/05/04 Java/Android
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers