学习JavaScript设计模式之策略模式


Posted in Javascript onJanuary 12, 2016

把不变的部分和变化的部分隔开是每个设计模式的主题。

  • 条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。

一、定义

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
基于策略类模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接收客户的请求,随后把请求委托给某一个策略类。

二、示例

计算奖金。绩效为S的发放4倍工资,绩效为A的发放3倍工资,绩效为B的发放2倍工资。

var strategies = {
 "S": function(salary) {
  return salary * 4;
 },
 "A": function(salary) {
  return salary * 3;
 },
 "B": function(salary) {
  return salary * 2;
 }
};

// 接收请求
var calculateBonus = function(level, salary) {
 return strategies[level](salary);
};

// 测试
console.log(calculateBonus("S", 20000));
console.log(calculateBonus("A", 20000));
console.log(calculateBonus("B", 20000));

三、延伸:表单验证

/* 校验策略对象 */
var validateStrategies = {
 isEmpty: function (val, errorMsg) {
  if (!val) {
   return errorMsg;
  }
 },
 isURL: function (val, errorMsg) {
  if (!new RegExp("^(http:\\/\\/|https:\\/\\/)?([\\w\\-]+\\.)+[\\w\\-]+(\\/[\\w\\-\\.\\/?\\@\\%\\!\\&=\\+\\~\\:\\#\\;\\,]*)?$").test(val)) {
   return errorMsg;
  }
 },
 isEmail: function (val, errorMsg) {
  if (!new RegExp('\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+').test(val)) {
   return errorMsg;
  }
 },
 isMaxLength: function (val, length, errorMsg) {
  if (val.length > length) {
   return errorMsg;
  }
 },
 isMinLength: function (val, length, errorMsg) {
  if (val.length < length) {
   return errorMsg;
  }
 }
};

/* validator类 */
var validator = function () {
 // 缓存验证策略
 this.cache = [];
};

/**
 * 添加要验证的策略
 * @param dom  要验证的dom元素
 * @param rules  验证规则
 */
validator.prototype.add = function (dom, rules) {
 var self = this;
 for (var i = 0, rule; rule = rules[i++];) {
  (function (rule) {
   var strategyAry = rule.strategy.split(":");  // ["isMaxLength", "10"]
   var errorMsg = rule.errorMsg;     // "内容长度不能超过10"
   self.cache.push(function () {
    var strategy = strategyAry.shift();   // "isMaxLength"
    strategyAry.unshift(dom.value);    // ["1@qq", "10"]
    strategyAry.push(errorMsg);     // ["1@qq", "10", "内容长度不能超过10"]
    return validateStrategies[strategy].apply(dom, strategyAry);
   });
  })(rule);
 }
};

/* 开始校验 */
validator.prototype.start = function () {
 for (var i = 0, validateFunc; validateFunc = this.cache[i++];) {
  var errorMsg = validateFunc();
  if (errorMsg) {
   return errorMsg;
  }
 }
};


// 测试

<label for="email">邮箱:</label><input type="text" name="email" value="1@qq">

var validatorInstance = new validator();
validatorInstance.add(
 document.getElementsByName("email")[0], 
 [{
  strategy: "isEmpty",
  errorMsg: "内容不能为空"
 },{
  strategy: "isMaxLength:10",
  errorMsg: "内容长度不能超过10"
 },{
  strategy: "isEmail",
  errorMsg: "email格式不对"
 }]);
errorMsg = validatorInstance.start();

希望本文所述对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
May 14 Javascript
javascript实现依次输入input自动定焦
Dec 23 Javascript
整理JavaScript创建对象的八种方法
Nov 03 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
Dec 24 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
浅析JavaScript动画模拟拖拽原理
Dec 09 Javascript
Angularjs中使用轮播图指令swiper
May 30 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 Javascript
详解vue-router导航守卫
Jan 19 Javascript
小程序云开发如何实现图片上传及发表文字
May 17 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
Nov 13 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
Jan 12 #Javascript
jQuery版本升级踩坑大全
Jan 12 #Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 #Javascript
7个jQuery最佳实践
Jan 12 #Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
Jan 12 #Javascript
JavaScript实现输入框(密码框)出现提示语
Jan 12 #Javascript
javascript自动恢复文本框点击清除后的默认文本
Jan 12 #Javascript
You might like
帅气的琦玉老师
2020/03/02 日漫
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
原生python实现knn分类算法
2019/10/24 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
Django admin组件的使用
2020/10/24 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
大学毕业感言一句话
2014/02/06 职场文书
优良学风班总结材料
2014/02/08 职场文书
合作协议书模板
2014/10/10 职场文书
恰同学少年观后感
2015/06/08 职场文书
工作证明格式范文
2015/06/15 职场文书