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 ...
随机推荐
- 【hive】——Hive基本操作
阅读本文章可以带着下面问题:1.与传统数据库对比,找出他们的区别2.熟练写出增删改查(面试必备) 创建表:hive> CREATE TABLE pokes (foo INT, bar STRIN ...
- C++基础——模拟事务 (2)Composite模式
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- phpRedis安装、配置及简单使用
安装phpRedis前,请先安装Redis,再安装phpRedis插件. 1.下载安装 在linux服务器上,命令行执行以下命令(cd ./usr local/src 一般源码放在这里(推荐源码安装) ...
- [mysql]三种方法为root账户指定密码
前言:前段时间把mysql安装后一直没管它,当时就在奇怪为什么mysql登陆不要密码,原来一直用的超用户账户登陆的(简称超级用户) 其实只怪自己太无知,之前一直用的phpbydamin进行的数据库的可 ...
- WPF文章资源库
MUHAMMAD SHUJAAT SIDDIQI
- 第3章 Linux常用命令(5)_网络命令和挂载命令
7. 网络命令 7.1 给用户发信息,以ctr+D保存结束 (1)write命令 命令名称 write 命令所在路径 /user/bin/write 执行权限 所有用户 语法 write <用户 ...
- iOS关于XML解析请求数据
XML数据的请求: 和json请求几乎一样,只有请求参数修改为xml即可: AFHTTPSessionManager *manager = [AFHTTPSessionManager manager] ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 检查版本升级、检查登录超时
当用户都在一个公司内,甚至一个办公室时,喉一下或者跑过去亲自更新一下程序,就可以了,问题就很简单也没多少复杂性,也不怎么考验技术能力.当面对全国10万以上客户端时,问题就来了. 1:有的用户打开系统一 ...
- 《如何在大学里脱颖而出(How to Win at College)》读书笔记
<如何在大学里脱颖而出(How to Win at College)>读书笔记 图书简介 中文版: 英文版: 作者卡尔·纽波特(Cal Newport)于 2004 年6月以优等生荣誉学会 ...
- VUE --- 给页面加点网络动态数据
这时候的页面都是静态的(数据在写程序的时候已经固定了不能修改),而每个应用基本上都会请求外部数据以动态改变页面内容.对应有一个库叫 vue-resource 帮我们解决这个问题. 使用命令行安装 cn ...