珠峰培训

javascript策略模式

作者:

2017-03-30 21:32:54

242

生活中的策略模式:比如出去旅游,到达目的地,有很多可选的方法,汽车,火车,飞机等.

策略模式的定义: 
定义一系列的算法,并进行封装,把算法的实现(逻辑部分)和算法的使用分离开来

一个策略模式至少包含这两部分组成:

  • 策略类:里面封装了具体的算法,也就是逻辑处理部分.
  • 环境类:负责对外接受客户的请求,把请求委托给某一策略类来处理(类似中转处理站).

用策略模式计算员工奖金,一公司,绩效S的年终4倍,绩效A的年终3倍,绩效B的年终2倍.

 // 封装了一个策略类,就是用来处理奖金计算的.里面有各种算法处理各种情况
var calculate = {
'S' : function(salary){
return salary*4;
},
'A': function(salary){
return salary*3;
},
'B' : function(salary){
return salary*2;
},
};

//封装一个环境类,负责对外接口,接受要处理的内容,再中转给策略类处理,不进行任何有关计算的代码

var bonus = function( salary , level ){
return calculate[level](salary);
};

console.log(bonus(4000,'S' )); // 16000
console.log(bonus(3000,'B')); // 6000`

DEMO,用策略模式来处理表单验证,表单验证处理在web前端太普通了,所以是比较好的例子.

需求:

  1. 用户名不为空
  2. 密码长度不小于6位
  3. 手机号码符合格式
// 策略对象,针对需求通过不同算法(函数)
var strategys = {
isNotEmpty: function(value,errorMsg) {
if(value === '') {
return errorMsg;
}
},
// 限制最小长度
minLength: function(value,length,errorMsg) {
if(value.length < length) {
return errorMsg;
}
},
// 手机号码格式
mobileFormat: function(value,errorMsg) {
if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) {
return errorMsg;
}
}
};
//验证器
var Validator = function(){
this.cache = []; // 保存效验规则
};
Validator.prototype.add = function(dom,rules) {
var self = this;
for(var i = 0, rule; rule = rules[i++]; ){
(function(rule){
var strategyAry = rule.strategy.split(":");
var errorMsg = rule.errorMsg;
self.cache.push(function(){
var strategy = strategyAry.shift();
strategyAry.unshift(dom.value);
strategyAry.push(errorMsg);
return strategys[strategy].apply(dom,strategyAry);
});
})(rule);
}
};
//启动验证器
Validator.prototype.start = function(){
for(var i = 0, validatorFunc; validatorFunc = this.cache[i++]; ) {
var msg = validatorFunc(); // 开始效验 并取得效验后的返回信息
if(msg) {
return msg;
}
}
};
// 代码调用
var registerForm = document.getElementById("registerForm");
// 环境类
var validateFunc = function(){
var validator = new Validator(); // 创建一个Validator对象
/* 添加一些效验规则 */
validator.add(registerForm.userName,[
{strategy: 'isNotEmpty',errorMsg:'用户名不能为空'},
{strategy: 'minLength:6',errorMsg:'用户名长度不能小于6位'}
]);
validator.add(registerForm.passWord,[
{strategy: 'minLength:6',errorMsg:'密码长度不能小于6位'},
]);
validator.add(registerForm.phoneNumber,[
{strategy: 'mobileFormat',errorMsg:'手机号格式不正确'},
]);
var errorMsg = validator.start(); // 获得效验结果
return errorMsg; // 返回效验结果
};
// 点击确定提交
registerForm.onsubmit = function(){
var errorMsg = validateFunc();
if(errorMsg){
alert(errorMsg);
return false;
}
}

总结:

  • 主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响 到客户端的情况下发生变化。
  • 策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
  • 策略模式的重心不仅是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
  • 策略模式中有三个对象: 
    1. 环境对象 :该类中实现了对抽象策略中定义的接口或者抽象类的引用。
    2. 抽象策略对象:它可由接口或抽象类来实现。
    3. 具体策略对象:它封装了实现同不功能的不同算法。