JS策略模式
1.策略模式的定义
策略模式又叫算法簇模式,将一组算法分装到一组具体共同接口的独立类或者对象中,它不影响客户端的情况下发生变化。
通常策略模式适用于当一个应用程序需要实现一种特点的服务和功能,而且该程序有多种实现方式时使用。
一般策略模式包含三个部分
1.环境对象:抽象策略对象的接口或者抽象类的引用。
2.抽象策略对象:一个一个的策略算法实现
3.具体策略对象:分装不同策略的算法(核心)
2.具体策略模式
我写了一个验证表单的策略算法:
//具体策略对象
var Validate = {
types:{}, //环境对象
config:{}, //环境对象
message:[],
validate:function(data,callback){
var i, msg, checker, result_ok,types;
var flag = 0, msg;
this.message = [];
for(i in data){
flag = 0;
msg = "";
types = this.config[i];
if(!types){
continue;
}
for(var j = 0; j < types.length; j++){
var type = types[j];
checker = this.types[type];
if(!checker){
throw {
name : "ValidationError",
message : "No handler to validate type" + type
};
}
result_ok = checker.validate(data[i]);
console.log("result_ok = "+result_ok);
if(!result_ok){
this.message.push(checker.instructions);
msg = checker.instructions;
flag = 1;
break;
}
}
console.log("i = "+i);
console.log("msg = " + msg);
if(flag){
callback(i, msg);
}
}
return this.hasErrors();
},
hasErrors:function(){
return this.message.length !== 0;
}
}
策略算法实现:
Validate.types.isEmail = {
validate:function(emailStr){
var reg_email=/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
return reg_email.test(emailStr);
},
instructions:"输入邮箱不合法"
}
Validate.types.isPhone = {
validate:function(phoneStr){
var reg_phone = /^((13[0-9])|(15[^4])|(18[0-9])|(17[0678])|(14[57]))\d{8}$/;
return reg_phone.test(phoneStr);
},
instructions:"输入电话号码不合法"
}
Validate.types.isNotEmpty = {
validate:function(str){
return !!str.replace(/(^\s*)|(\s*$)/g,"");
},
instructions:"不能为空"
}
调用方式:
//配置验证信息
Validate.config = {
name: ['isNotEmpty'],
// idcard:['isNotEmpty','checkCardId'],
// mobile:['isNotEmpty','isPhone'],
channel:['isNotEmpty'],
company_name:['isNotEmpty'],
// work_level:['isNotEmpty'],
// work_years:['isNotEmpty','isNumber'],
email:['isNotEmpty','isEmail']
};
Validate.message = [];
Validate.validate(data,function(id,msg){
$("#"+id).parent('[name=hasError]').addClass('has-error');
$("#"+id+"_error_tips").text(msg).show();
});
if(!Validate.hasErrors()) {
$.ajax({
url: that.cgi.addlist,
type: 'POST',
dataType: 'json',
data: data
}).done(function(result,xhr,status) {
if(result.retCode === 0){
myUtils.showDialog("添加成功",result.retMsg,'type-info',BootstrapDialog.SIZE_SMALL,function(){
location.reload();
});
}else if(result.retCode == 10301){
location.href="/boss/admin/index.html";
}else{
myUtils.showDialog("添加失败",result.retMsg,'type-danger',BootstrapDialog.SIZE_SMALL);
}
}).fail(function(xhr,status) {
myUtils.showDialog("添加失败","网络繁忙,请稍后再试!",'type-danger',BootstrapDialog.SIZE_SMALL);
});
}
JS策略模式的更多相关文章
- js 策略模式 实现表单验证
策略模式 简单点说就是:实现目标的方式有很多种,你可以根据自己身情况选一个方法来实现目标. 所以至少有2个对象 . 一个是策略类,一个是环境类(上下文). 然后自己就可以根据上下文选择不同的策略来执 ...
- js策略模式vs状态模式
一.策略模式 1.定义:把一些小的算法,封装起来,使他们之间可以相互替换(把代码的实现和使用分离开来)2.利用策略模式实现小方块缓动 html代码: <div id="containe ...
- js --策略模式
策略模式的定义: 将算法一个个的单独进行封装,并且使他们可以相互替换.此模式让算法的变化不会影响到使用算法的客户. 先回顾一下,我们在做项目的过程中,是不是经常会遇见因为业务逻辑的关系,我们会写好多的 ...
- js设计模式(二)---策略模式
策略模式: 定义: 定义一系列的算法,把他们一个个封装起来,并且是他们可以相互替换 应用场景: 要求实现某一个功能有多种方案可以选择.比如:条条大路通罗马 实现: 场景,绩效为 S的人年终奖有 4倍工 ...
- JS设计模式(2)策略模式
什么是策略模式? 定义:根据不同参数可以命中不同的策略 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:有许多种情况,而区分它们的只是他们直接的行为. ...
- js设计模式总结-策略模式
策略模式 要解决的问题 当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题, 比如增加一种的新的方法时,就不得不再 ...
- 3.js模式-策略模式
1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...
- 大熊君说说JS与设计模式之------策略模式Strategy
一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...
- JS常用的设计模式(9)——策略模式
策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.一个小例子就能让我们一目了然. 回忆下jquery里的animate方法. $( div ).animate( {&quo ...
随机推荐
- Hadoop 之 MapReduce 框架演变详解
经典版的MapReduce 所谓的经典版本的MapReduce框架,也是Hadoop第一版成熟的商用框架,简单易用是它的特点,来看一幅图架构图: 上面的这幅图我们暂且可以称谓Hadoop的V1.0版本 ...
- Linux第一天 ssh登录和软件安装详解
Linux学习第一天 操作环境: Ubuntu 16.04 Win10系统,使用putty_V0.63 本身学习Linux就是想在服务器上使用的.实际情况,可能我很难直接到坐在服务器前,使用界面操作系 ...
- oh-my-zsh主题
什么是ZSH Zsh和bash一样,是一种Unix shell,但大多数Linux发行版本都默认使用bash shell.但Zsh有强大的自动补全参数.文件名.等功能和强大的自定义配置功能. 一.安装 ...
- AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)
P4746 C’s problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...
- 用extract-text-webpack-plugin提取出来的css文件中背景图片url的不正确的问题
在一个main.js中require一个scss文件,scss文件中用了背景图片,图片url是用的相对路径,用extract-text-webpack-plugin插件提取出的css文件背景图片路径不 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 远程同步服务器大量基础数据到客户端
服务器上保存有上万条的基础数据,需要同步到全国各地的成千上万个客户端,而且这些基础数据也经常在有变化调整.这时候需要有一个稳定的数据同步程序,能分批同步基础数据,由于网络流量,网络的稳定性等因素,需要 ...
- IO(三)----序列流
SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的 ...
- Unity、Exception Handling引入MVP
什么是MVP?在“MVP初探”里就有讲过了,就是一种UI的架构模式. 简单的描述一下Unity和Exception Handling Application Block: Unity是一个轻量级的可扩 ...
- C#系列——记一次业务需求:对象的深拷贝
这篇随笔着实在意料之外,主要是源于上周开发BS的一个业务,需要用到对象的深拷贝.说的直白一点,就是将对象内存分配区和引用完全拷贝一份新的.这种需求以前就遇到过,怎么解决的已经记不清了.这次趁着这个机会 ...
- Memcached telnet端命令
Command Description Example get Reads a value get mykey set Set a key unconditionally set mykey 0 60 ...