好比在多个条件判断中,也许条件会被更改这样的话,咱们又得从新写过,策略模式就是解决这个问题。dom
var get = {
A:function(){
console.log('a');
},
B:function(){
console.log('b');
}
};this
var getAB = function(why){
return get[why]();
};prototype
getAB('B');对象
表单验证:get
用户名:<input type="text" name="userName" id="user">input
// 规则列表
var obj = {
isempty:function(val,errmsg){
if(val===''){return errmsg;};
},
minLen:function(val,len,errmsg){
if(val.length<len){return errmsg;};
}
};it// 定义如何添加规律
var v = function(){io//保存错误信息列表
this.count = [];
};consolev.prototype.add = function(val,rule,errmsg){
var arr = rule.split(':');
if(arr.length==1){
this.count.push(obj[rule](val,errmsg));
}else{
this.count.push(obj[arr[0]](val,arr[1],errmsg));
}
};
//返回验证结果列表
v.prototype.stat = function(){
return this.count.join(',');
};function
--------------------------------------
//使用实例
// 添加你须要的规律
var c = function(dom){
var s = new v();
s.add(dom.value,'isempty','用户名不能为空!');
s.add(dom.value,'minLen:3','用户名长度不能小于3');
return s.stat();
};
var user = document.getElementById('user');
user.onblur = function(){
var msg = c(user);
console.log(msg);
};
先学会怎么去用,再来编写核心代码。
升级版,给一个元素添加多个规则
var obj = {
isempty:function(val,errmsg){
if(val===''){return errmsg;};
},
minLen:function(val,len,errmsg){
if(val.length<len){return errmsg;};
}
};
var v = function(){
this.count = [];
};v.prototype.add = function(val,arr){
for(var i=0;i<arr.length;i+=1){
var rule = arr[i]['rule'].split(':');
var r = null;
if(rule.length===1){
r = obj[rule[0]](val,arr[i]['errmsg']);
}else{
r = obj[rule[0]](val,rule[1],arr[i]['errmsg']);
}
r&&this.count.push(r);
}
};v.prototype.stat = function(){
return this.count.join(',');
};
var c = function(dom){
var s = new v();
s.add(dom.value,[{rule:'isempty',errmsg:'用户名不能为空!'},{rule:'minLen:5',errmsg:'用户名长度不能小于5'}]);
return s.stat();
};
var user = document.getElementById('user');
user.onblur = function(){
var msg = c(user);
if(msg){
console.log(msg);
return false;
}
console.log('所有验证成功');
};
若是后期须要增长规律咱们只须要这样
var obj = {
isempty:function(val,errmsg){
if(val===''){return errmsg;};
},
minLen:function(val,len,errmsg){
if(val.length<len){return errmsg;};
},
maxLen:function(val,len,errmsg){
if(val.length>len){return errmsg;};
}
};var c = function(dom){
var s = new v();
s.add(dom.value,[{rule:'isempty',errmsg:'用户名不能为空!'},{rule:'minLen:5',errmsg:'用户名长度不能小于5个'},{rule:'maxLen:10',errmsg:'用户名长度不能超过10个'}]);
return s.stat();
};
其余不变,这样话维护起来仍是很方便的,虽然代码是多了点。
小小的总结一下策略模式,固然是我我的的理解,不必定正确,本来咱们把判断都写在一块儿,若是后期须要添加规则的话又获得里面去更改逻辑,而策略模式推荐你把这里规则单独提取出来,放到一个对象里面,你须要用到哪些规则你就添加哪些规则,这样的话,代码复用性也强,我以为面向对象绝大部分都是在讲代码复用性。