策略模式

 

策略模式的定义:定义⼀系列的算法,把他们⼀个个封装起来,并且使他们可以相互替换。
 
策略模式的⽬的就是将算法的使⽤算法的实现分离开来。
 
⼀个基于策略模式的程序⾄少由两部分组成。第⼀个部分是⼀组策略类(可变),策略类封装了具体的
算法,并负责具体的计算过程。第⼆个部分是环境类Context(不变),Context接受客户的请求,随后
将请求委托给某⼀个策略类。要做到这⼀点,说明Context中要维持对某个策略对象的引⽤
 
举个栗⼦
    奖⾦计算,绩效为 S 的⼈年 终奖有 4 倍⼯资,绩效为 A 的⼈年终奖有 3 倍⼯资,⽽绩效为 B 的⼈年终
    奖是 2 倍⼯资
var calculateBonus = function( performanceLevel, salary ){
if ( performanceLevel === 'S' ){
return salary * 4;
}
if ( performanceLevel === 'A' ){
return salary * 3;
}
if ( performanceLevel === 'B' ){
return salary * 2;
}
};
calculateBonus( 'B', 20000 ); // 输出:40000
calculateBonus( 'S', 6000 ); // 输出:24000
使⽤策略模式
var strategies = {
"S": function( salary ){
return salary * 4;
},
"A": function( salary ){
return salary * 3;
},
"B": function( salary ){
return salary * 2;
}
};
var calculateBonus = function( level, salary ){
return strategies[ level ]( salary );
};
console.log( calculateBonus( 'S', 20000 ) );// 输出:80000
console.log( calculateBonus( 'A', 10000 ) );// 输出:30000
表单校验
// 正常写法
var registerForm = document.getElementById( 'registerForm' );
registerForm.onsubmit = function(){
if ( registerForm.userName.value === '' ){
alert ( '⽤户名不能为空' );
return false;
}
if ( registerForm.password.value.length < 6 ){
alert ( '密码⻓度不能少于 6 位' );
return false;
}
if ( !/(^1[3|5|8][0-9]{9}$)/.test( registerForm.phoneNumber.value ) ){
alert ( '⼿机号码格式不正确' );
return false;
}
}
 
使⽤策略模式
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]{9}$)/.test( value ) ){
return errorMsg;
}
}
};
 
var Validator = function(){
this.cache = []; // 保存校验规则
};
Validator.prototype.add = function(
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;
}
}
};
var validataFunc = function(){
var validator = new Validator(); // 创建⼀个 validator 对象
/***************添加⼀些校验规则****************/
validator.add( registerForm.userName, 'isNonEmpty', '⽤户名不能为空' );
validator.add( registerForm.password, 'minLength:6', '密码⻓度不能少于 6位');
validator.add( registerForm.phoneNumber, 'isMobile', '⼿机号码格式不正确' );
var errorMsg = validator.start(); // 获得校验结果
return errorMsg; // 返回校验结果
}
var registerForm = document.getElementById( 'registerForm' );
registerForm.onsubmit = function(){
var errorMsg = validataFunc(); // 如果 errorMsg 有确切的返回值,说明未通过校验
if ( errorMsg ){
alert ( errorMsg );
return false; // 阻⽌表单提交
}
};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

posted @ 2020-07-30 16:38  又回到了起点  阅读(166)  评论(0编辑  收藏  举报