《JavaScript设计模式与开发实践》读书笔记之策略模式
1.策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换
1.1 传统实现
根据工资基数和年底绩效来发送年终奖
var calculateBonus= function (performanceLevel,salary) {
if(performanceLevel === 'S'){
return salary * 4;
}
if(performanceLevel === 'A'){
return salary * 3;
}
if(performanceLevel === 'B'){
return salary * 2;
}
};
calculateBonus('B',20000);//输出40000
calculateBonus('S',6000);//输出24000
calculateBonus()函数包含了很多if-else语句,这些语句需要覆盖所有分支
calculateBonus()函数缺乏扩展性,如果新增一个绩效等级C,必须修改calculateBonus()函数内部实习,违反开发-封闭原则
1.2 使用策略模式重构代码
传统面向对象模式的策略模式
var performanceS= function () {};
performanceS().prototype.calculate= function (salary) {
return salary *4;
};
var performanceA=function(){};
performanceA().prototype.calculate=function(salary){
return salary * 3;
};
var Bonus= function () {
this.salary=null;
this.strategy=null;
};
Bonus.prototype.setSalary= function (salary) {
this.salary=salary;
};
Bonus.prototype.setStrategy=function(strategy){
this.strategy=strategy;
};
Bonus.prototype.getBonus= function () {
return this.strategy.calculate(this.salary);
};
var bonus=new Bonus();
bonus.setSalary(1000);
bonus.setStrategy(new performanceS());
console.log(bonus.getBonus()());//输出40000
1.3 JavaScript版本的策略模式
var strategies={
"S": function (salary) {
return salary*4;
},
"A": function (salary) {
return salary*3;
},
"B": function (salary) {
return salary*2;
}
};
//calculateBonus充当Context来接受用户请求
var calculateBonus= function (level,salary) {
return strategies[level](salary);
};
console.log(calculateBonus('S',2000));//输出8000
1.4 用策略模式来重构表单校验
校验规则
用户名不能为空
密码长度不能少于6位
手机号码必须符合格式
var strategise={
isNonEmpty:function(value,errorMsg){
if(value === ''){
return errorMsg;
}
},
minLength: function (value,length,errorMsg) {
if(value.length<length){
return errorMsg;
}
},
isMobile: function (value,errorMsg) {
if(!/(^1[3|5|8][0-9]{9}$)/.test(value)){
return errorMsg;
}
}
};
Validateor类作为Context,负责接收用户请求,并委托给strategy对象
var validataFunc= function () {
var validator=new Validator();
//添加校验规则
validator.add(form.userName,'isNonEmpty','用户名不能为空');
validator.add(form.password,'minLength:6','密码长度不能少于6位');
validator.add(form.phoneNumber,'isMobile','手机号码格式不正确');
var errorMsg=validator.start();
return errorMsg;
};
var form =document.getElementById('form');
form.onsubmit= function () {
var errorMsg=validataFunc();
if(errorMsg){
alert(errorMsg);
return false;
}
};
var Validator= function () {
this.cache=[];
};
Validator.prototype.add= function (dom,rule,errorMsg) {
var ary=rule.split(':');//把strategy算法和参数分开
this.cache.push(function () {
var strategy=ary.shift();
ary.unshift(dom.value);
ary.push(errorMsg);
return strategies[strategy].apply(dom,ary);
});
};
Validator.prototype.start= function () {
for(var i= 0,validatorFunc;validatorFunc=this.cache[i++];){
var msg=validatorFunc();
if(msg){
return msg;
}
}
};
使用策略模式,可以通过配置方式完成表单校验
《JavaScript设计模式与开发实践》读书笔记之策略模式的更多相关文章
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)
说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)
上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...
- Javascript设计模式与开发实践读书笔记(1-3章)
第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用 多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切 ...
- javascript设计模式与开发实践阅读笔记(5)——策略模式
策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率 ...
- javascript设计模式与开发实践阅读笔记(8)——观察者模式
发布-订阅模式,也叫观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 在JavaScript开发中,我们一般用事件模型来替代传统的观察者模式. ...
- javascript设计模式与开发实践阅读笔记(7)——迭代器模式
迭代器模式:指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...
- javascript设计模式与开发实践阅读笔记(6)——代理模式
代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对 ...
- javascript设计模式与开发实践阅读笔记(4)——单例模式
定义 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 具体来说,就是保证有些对象有且只有一个,比如线程池.全局缓存.浏览器中的window 对象等.在js中单例模式用途很广,比如登录 ...
- 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式
第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...
- 《JavaScript设计模式与开发实践》笔记第一章
第一章 面向对象的JavaScript 动态类型语言和鸭子类型 编程语言按照数据类型大体可以分为两类:静态类型语言.动态类型语言. 静态类型语言:在编译时便已确定变量的类型. 优点: 在编译时就能发现 ...
随机推荐
- Eclipse使用总结
Eclipse使用总结 1.Eclipse中出现无法找到Maven包 症状:出现org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER, 且出现无法找 ...
- AngularJS之Service4
AngularJS之Service(四) 前言 前面我们讲了控制器.过滤器以及指令,这一节我们来讲讲重大内容之一服务和其中涉及到的工厂. 话题 AngularJS中服务可以说是和DI紧密联系在一起 ...
- Android——与查询联系人相关的3张表
- mssql数据库游标批量改动符合条件的记录
//需求:因为项目刚上传,没有票数,为了表现出一定的人气,须要在一開始把各项目的票数赋一个值 , 但每一个项目不能一样,否则easy看出问题,呵呵 . DECLARE @Id varchar(50) ...
- hdu 4712 Hamming Distance bfs
我的做法,多次宽搜,因为后面的搜索扩展的节点会比较少,所以复杂度还是不需要太悲观的,然后加上一开始对答案的估计,用估计值来剪枝,就可以ac了. #include <iostream> #i ...
- MFC实现多风格真彩色大图标工具栏按钮
研究zlib库,想实现一个类似winrar功能的小东东,打开winrar界面看它的工具栏比较好看于是动手想做一个,当然资源也使用的是winrar附带的.下面是截图:真彩色(32位)32*32大图标工具 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(二)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...
- Oauth认证的时候报错:timestamp_refused
今天server大规模报错,大部分用户无法登陆,小部分能够登陆,非常是奇怪. 查看log.调试代码,发现问题是在oauth认证的时候出了问题,报 timestamp_refused. google了下 ...
- ThinkPhp学习07
原文:ThinkPhp学习07 简单CRUD操作 public function show() { $m=M('User'); // $arr=$m->find(2); //查找id=2的数据, ...
- CURD特性
本节课大纲: 一.ThinkPHP 3 的CURD介绍 (了解) 二.ThinkPHP 3 读取数据 (重点) 对数据的读取 Read $m=new Model('User'); ##返回一个实例 $ ...