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设计模式--策略模式的更多相关文章

  1. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  2. javascript设计模式——策略模式

    前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ...

  3. javascript设计模式-策略模式

    策略模式笔记   将定义的一组算法封装起来,使其相互之间可以替换.   封装的算法具有一定独立性,不会随客户端变化而变化.   与状态模式异同?     1. 结构上看,它与状态模式很像,也是在内部封 ...

  4. JavaScript设计模式 - 策略模式(表单验证)

    表单提交的时候,总是要校验,不同的表单可能校验相同的功能. 为了避免代码重复的复制黏贴,使用策略模式,写出来的代码赏心悦目,且可扩展,还可以作为插件到处使用 <!DOCTYPE html> ...

  5. JavaScript实现策略模式

    在开篇之前先分享今天看到的一句关于设计模式的话:将不变的部分和变化的部分隔开是每个设计模式的主题 请大家自行感受这句话的精髓所在,并且思考学习设计模式究竟能给我们编程带来什么样的东西,欢迎大家在文章下 ...

  6. JS设计模式——策略模式

    设计模式高大上,业务代码用不上...平时用不上我们就可以忽略了吗? 非也,就像面试造火箭,工作拧螺丝一样.万一我们公司哪天要造火箭了,你得立马能上手. 同时,有些复杂的业务代码也可以用设计模式的思想去 ...

  7. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  8. [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)

    [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...

  9. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  10. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

随机推荐

  1. P - Atlantis (线段树+扫描线)

      There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Som ...

  2. 二分法C++与Python

    来源于Leetcode C++ int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) retu ...

  3. 忘记mysql root用户密码的解决办法(skip-grant-tables)

    skip-grant-tables顾名思义,数据库启动的时候 跳跃权限表的限制,不用验证密码,直接登录. 注意: 这种情况只有在忘记root密码 不得已重启数据库的情况下使用的.现网环境慎用,需要重启 ...

  4. jmeter json乱码

    0 环境 系统环境:win7 1 操作 1 找到jmeter.properties 找到jmeter下的bin目录jmeter.properties文件 例如apache-jmeter-\bin\jm ...

  5. 吴裕雄--天生自然python学习笔记:爬取我国 1990 年到 2017年 GDP 数据并绘图显示

    绘制图形所需的数据源通常是不固定的,比如,有时我们会需要从网页抓取, 也可能需从文件或数据库中获取. 利用抓取网页数据技术,把我国 1990 年到 2016 年的 GDP 数据抓取出来 ,再利用 Ma ...

  6. 前端-js-长期维护

    ###############    JS简介和JS引入     ################ <!DOCTYPE html> <html lang="en" ...

  7. REMODE解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 纯视觉的三维重建(不考虑用结构光的那一类)常用的有两大类方法:一类是SfM,缺点是计算量比较大,做不到实时运行:另一类是KinectFusion为 ...

  8. Redis学习之热点key重建

    在Redis的生产环境中,大量客户端连接请求某一个key,但都需要从DB中获取数据,来回写数据库,如下图: <ignore_js_op> 造成的问题: 大量的线程请求数据库,造成数据库压力 ...

  9. 性能分析之工具使用——cpu、io 、mem【工具分析】

    nmon nmon 是一种在aix 与各种 Linux 操作系统上广泛使 用的监控与与分析工具,他主要记录以下内容: • cpu 占用率 • 内存使用情况 • 磁盘I/O 速度.传输和读写比率 • 文 ...

  10. python3多进程爬虫(第二卷)

    上卷中讲到,我有4个进程,可是我要同时爬取20+数据怎么办,很明显上卷的语法公式不可以,所以现在我引入线程池 现在看一下线程池的语法 看一下爬虫: 注意圈中重点