您的位置:首页 > Web前端 > JavaScript

js:策略模式

2017-11-27 23:27 344 查看

策略模式

定义一系列算法,将各算法封装起来,并且可以互相替换。

即一类函数封装好后,再由一个接口函数实现根据不同参数调用不同函数。

简单理解:

var testFuncs = {
"A": function(a,b){ return parseInt(a) + parseInt(b);},
"B": function(a,b){ return parseInt(a) - parseInt(b);},
"C": function(a,b){ return parseInt(a) * parseInt(b);},
"D": function(a,b){ return parseInt(a) / parseInt(b);}
}
var testInterface = function(fname, a, b){
return testFuncs[fname](a,b);
}

console.log( testInterface("A", "1", "2a") );
console.log( testInterface("B", "1", "2A") );
console.log( testInterface("D", "1", "2D") );


应用于表单验证:

(function(win){
var Validator = function(){
// 保存规则
this.rules = {};
// 内部添加一些规则
// 必要性检查
this.addRule(
function(arr){
if(arr[0] === "") return false;
return true;
}, "isRequire");
// 最小长度检查
this.addRule(
function(arr){
if(arr[0].length < arr[1]) return false;
return true;
}, "minLength");
// 最大长度检查
this.addRule(
function(arr){
if(arr[0].length > arr[1]) return false;
return true;
}, "maxLength");
// 手机号检查
this.addRule(
function(arr){
if(!(/(^1[3|5|8][0-9]{9}$)/).test(arr[0]) ) return false;
return true;
}, "isPhoneNum");
}
// 外部可 动态添加策略
Validator.prototype.addRule = function(fn, ruleName){
if (this.rules[ruleName]) return true;
this.rules[ruleName] = fn;
}

/**业务调用 校验接口
* arr  [ [ruleName, [rule参数1,rule参数2.], errMsg],... ]
*/
Validator.prototype.check = function(arr){
var tempRule = null
, tempCheck = null;

for (var i=0, len = arr.length; i<len; i++){
tempCheck = arr[i];
if (tempCheck.length < 3)
throw new Error("要检查的项 " + i + ": 参数不足");
tempRule = this.rules[tempCheck[0]];
if (!tempRule)
throw new Error("未定义校验规则:" + tempCheck[0]);
// 检查 规则校验结果,第一次遇到不满足 便退出
if (!tempRule(tempCheck[1])){
return tempCheck[2];
}

tempRule = null;
}
// 所有检查结束且满足规则,返回 true
return true;
}

win.Validator = Validator;
})(window);

var validator = new Validator;
var str1 = "sfdgdg";
var name1 = "Asddddd";
var phone1 = "1265554";
var res = validator.check([
["isRequire", [str1], "str1 不能为空"]
]);
// 不使用 != 检查
if (res !== true){
console.log(res);
}else{
console.log("验证通过"); // 输出 验证通过
}

res = validator.check([
["isRequire", [str1], "str1 不能为空"]
,["minLength", [name1, 6], "name1 长度至少为6。"]
,["maxLength", [name1, 10], "name1 长度最大为10。"]
,["isPhoneNum", [phone1], "phone1 不是正确的手机号。"]
]);

if (res !== true){
console.log(res); // 输出 phone1 不是正确的手机号
}else{
console.log("验证通过");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript