Skip to main content

策略模式

策略模式

策略模式的目的就是将算法的使用与算法的实现分离开,一个策略模式的程序至少由两部分组成。

第一个部分是策略类,策略类封装了具体的算法,并负责具体的计算过程。

第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。

场景:表单检验

/*Validator类的实现*/
var Validator = function(){
this.cache = [];
}
Validator.prototype.add =function(dom,rule,errorMsg){
var ary = rule.split(':');
this.cache.push(function(){
var strategy =ary.shift();
ary.unshift(dom.value);
ary.push(errorMsg);
return strategies[strategy].apply(dom,ary);
});
};

Validator.prototype.start = function(){
for(var i=0,validatorFunc;validatorFunc = this.cache[i++]){
var msg=validatorFunc();
if(msg){
return msg;
}
}
}

/*定义strategy*/
var strategies = {
isNonEmpty:function(value,errorMsg){
if(value=''){
return errorMsg;
}
},
minLength:function(value,length,errorMsg){
if(value.length<length){
return errorMsg
}
},
isMobile:function(value,errorMsg){
if(!/^1[3|5|8][0-9]$/.test(value)){
return errorMsg;
}
}
}

/*定义Context*/
var validataFunc = function(){
var validator = new Validator();
validator.add(registerForm.userName,'isNonEmpty','用户名不能为空’);
validator.add(registerForm.password,'inLength:6',密码长度不能少于6'')
validator.add(registerForm.phoneNumber,'isMobile','手机号码格式不正确’);

var errorMsg = validator.start();
return errorMsg;
}

var registerForm = document.getElementById("registerForm");
registerForm.onsubmit = function(){
varerrorMsg = validataFunc();
if(errorMsg){
alert(errorMsg);
return false;
}
}