js设计模式之策略模式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

js设计模式之策略模式// 策略模式
var validataRules = {
'minLeng' :function(val, length, msg) {
if (val && val.length > 6) {
return msg
}
},
'isMobile': function(val, msg){
if (!/(^1[3|5|8][0-9]{9}$)/.test(val)){
return msg
}
},
'isCardId': function(val, msg){
if (!/(^[1-9][1-9]{17}$)/.test(val)){
return msg
}
},
isNonEmpty: function (val, msg) {
if (val === '') {
return msg;
}
}
}
var validata = function () {
this.item = []
}
validata.prototype = {
construcor: validata,
add:function(val, rules) {
var self = this;
for(let i=0; i< rules.length; i++){
self.item.push(function(){
var argArr = rules[i].valiName.split(':');
var ruleName = argArr.shift()
argArr.unshift(val)
argArr.push(rules[i].msg)
return validataRules[ruleName].apply(self, argArr)
})
}
},
start:function(){
for ( let i=0;i<this.item.length;i++){
var msg = this.item[i]()
if (msg){
return msg
}
}
}
}
$('#btn3').click(function() {
var validataFunc = new validata()
validataFunc.add('123',[{
valiName:'isMobile',
msg:'请输⼊正确⼿机号'
},{
valiName:'isNonEmpty',
msg:'请输⼊内容'
}])
var errMsg = validataFunc.start()
if (errMsg){
console.log(errMsg)
}
});
})
1. 定义
定义⼀系列的算法,把它们⼀个个封装起来,并且使它们可以相互替换。

2. 核⼼
将算法的使⽤和算法的实现分离开来。

⼀个基于策略模式的程序⾄少由两部分组成:
第⼀个部分是⼀组策略类,策略类封装了具体的算法,并负责具体的计算过程。

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

要做到这点,说明Context 中要维持对某个策略对象的引⽤
3. 实现
策略模式可以⽤于组合⼀系列算法,也可⽤于组合⼀系列业务规则
假设需要通过成绩等级来计算学⽣的最终得分,每个成绩等级有对应的加权值。

我们可以利⽤对象字⾯量的形式直接定义这个组策略
4. 优缺点
优点
可以有效地避免多重条件语句,将⼀系列⽅法封装起来也更直观,利于维护
缺点
往往策略集会⽐较多,我们需要事先就了解定义好所有的情况。

相关文档
最新文档