javascript设计模式--策略模式
javascript策略模式总结
1.什么是策略模式?
策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换。
例如我们需要写一段代码来计算员工的奖金。当绩效为a时,奖金为工资的5倍,绩效为b时,奖金为工资的3倍,绩效为c时,奖金为工资的1.5倍:
var strategy = {
"a":function(salary){
return salary*5;
},
"b":function(salary){
return salary*3;
},
"c":function(salary){
return salary*1.5;
}
};
var calculate = function(levle,salary){
return strategy[levle](salary);
}
//a级奖金
calculate('a',15000);
上面例子中,各种绩效对应着不同的算法,因此把他们封装在strategy里。calculate负责接受请求,然后把请求委托给指定的
策略类。这种实现方式,就是策略模式。
2.策略模式的优势
看回上面的例子,具体的算法和接受请求的函数是相互独立的,当我们需要添加新的等级d时,只需要在strategy中添加相应的算法就可以了,不需要修改到calculate,十分的灵活。
3.策略模式的使用
如果策略模式仅仅是用来封装算法,可能有点小才大用了。在实际开发中,可以用来封装一系列的业务规则,并且灵活的调用它们。
例如在表单验证中,就常常会使用到策略模式。
var strategy = {
isNotEmpty:function(val,errorMsg){ //不为空
if(val === ""){
return errorMsg;
}
}
isMobile:function(val,errorMsg){ //手机号
if(!/^1[3|5|8][0-9]{9}$/.test(val)){
return errorMsg;
}
}
}
//实现validator,负责接收请求。
var Validator = function(){
this.cache = [];
};
Validator.protype.add = function(dom,rule,errorMsg){
this.cache.push(function(){
return strategy[rule](dom.value,errorMsg);
})
};
Validator.protype.start = function(){
var len = this.cache.length;
for(var i = 0 ; i<len; i++){
var msg = this.cache[i];
if(msg){
return msg;
}
}
};
var validatorFun = function(){
var validator = new Validator();
validator.add($("#username"),'isNotEmpty','用户名不为空');
validator.add($("#mobile"),'isMobile','手机号码格式错误');
var errorMsg = validator.start();
return errorMsg;
};
//调用验证
var errormsg = validatorFun();
if(errormsg){
alert(errormsg);
return false;
}
> 使用策略模式之后,我们可以用过配置strategy来添加验证规则,可以很好的进行复用,避免了很多条件选择语句和代码的复制粘贴。
原文链接:javascript设计模式--策略模式
javascript设计模式--策略模式的更多相关文章
- javascript 设计模式-----策略模式
在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...
- javascript设计模式——策略模式
前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ...
- javascript设计模式-策略模式
策略模式笔记 将定义的一组算法封装起来,使其相互之间可以替换. 封装的算法具有一定独立性,不会随客户端变化而变化. 与状态模式异同? 1. 结构上看,它与状态模式很像,也是在内部封 ...
- JavaScript设计模式 - 策略模式(表单验证)
表单提交的时候,总是要校验,不同的表单可能校验相同的功能. 为了避免代码重复的复制黏贴,使用策略模式,写出来的代码赏心悦目,且可扩展,还可以作为插件到处使用 <!DOCTYPE html> ...
- JavaScript实现策略模式
在开篇之前先分享今天看到的一句关于设计模式的话:将不变的部分和变化的部分隔开是每个设计模式的主题 请大家自行感受这句话的精髓所在,并且思考学习设计模式究竟能给我们编程带来什么样的东西,欢迎大家在文章下 ...
- JS设计模式——策略模式
设计模式高大上,业务代码用不上...平时用不上我们就可以忽略了吗? 非也,就像面试造火箭,工作拧螺丝一样.万一我们公司哪天要造火箭了,你得立马能上手. 同时,有些复杂的业务代码也可以用设计模式的思想去 ...
- 15. 星际争霸之php设计模式--策略模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
随机推荐
- java 计算一个月有多少天和多少周
import java.util.Calendar; /** * 功能概述:计算指定年月的天数和周数<br> */ public class Test{ public static voi ...
- Andriod常用控件介绍&相关属性(初学方便查询)
一.TextView(显示控件) android:id(给当前控件定义唯一的标识符)——示例:android:id = "@+id/text_view" android:layou ...
- git理论知识
1.Git 有三种状态,你的文件可能处于其中之一:已提交(committed).已修改(modified)和已暂存(staged) 由此引入 Git 项目的三个工作区域的概念:Git 仓库.工作目录以 ...
- redis中间件
redis的集群:集群策略:主从复制(从库从主库同步获取数据,本身不提供服务)哨兵(监控主库和从库,当主库挂的时候自动把从库选一个切换为主库,主库存放的是全量数据)集群参考:https://blog. ...
- 106)PHP,缩略图代码和结果展示
首先是 代码展示: <?php class CImage { /** * 生成保持原图纵横比的缩略图,支持.png .jpg .gif * 缩略图类型统一为.png格式 *@param $src ...
- http接口与webservice接口的区别
常见的API接口有两类:http接口和webservice接口. http接口走http协议,通过路径来区分调用方法,请求报文一般是key-value形式的,返回报文一般是json串,常用的是get和 ...
- Codeforces Roundd #573 (Div. 2)
D. Tokitsukaze, CSL and Stone Game 题意:有n堆石头,每人每次只能去一颗石子,若轮到当前人没任何一堆石子可以取或当前人取到后剩下有俩堆石子个数相同则当前人输: 给定石 ...
- Jenkins+maven+jmeter+eclipse搭建自动化测试平台
一.准备工作 1.jmeter准备测试脚本 2.maven环境配置 3.eclipse创建maven项目 4.Jenkins集成项目 二.jmeter准备测试脚本 使用jmeter准备测试脚本(不管录 ...
- EmguCV从位图(Bitmap)加载Image<Gray,byte>速度慢的问题
先说背景.最近在用C#+EmguCV(其实就是用P/Invoke封闭了OpecCV,与OpenCVDotNet差不多) 做一个视频的东西.视频是由摄像头采集回来的1f/s,2048X1000大小,其实 ...
- deeplearning.ai 序列模型 Week 1 RNN(Recurrent Neural Network)
1. Notations 循环序列模型的输入和输出都是时间序列.$x^{(i)<t>}$表示第$i$个输入样本的第$t$个元素,$T_x^{(i)}$表示输入的第$i$个样本的元素个数:$ ...