javascript设计模式之策略模式
数据验证之简易方式
// 举例 常见的验证表单字段经常是if else 或者 switch case var validater = { validate: function (value, type) { switch (type) { case 'isNonEmpty ': break; // NonEmpty 验证结果 case 'isNumber ': break; // Number 验证结果 case 'isAlphaNum ': break; // AlphaNum 验证结果 default: return true; } } }; // 测试 alert(validater.validate("123", "isNonEmpty"));
数据验证之策略模式
// source: http://jsfiddle.net/ganksolo/4ezZ4/ /* * 策略模式 * 策略模式定义了一系列算法,这些算法都是做相同的事情,只是实现不同 * 减少了算法类与使用算法类之间的耦合 */ /* * 算法封装 -> 需要验证的数据 -> 根据数据配置验证器规则(策略模式的体现) * 1.把验证的算法分别封装起来,让统一的验证器(validator)来分别处理 * 2.开发者只需提供需要验证的表单数据(可以是一个js对象)算法 * 3.开发者根据需要验证的数据(这里指表单数据),设置验证器有效规则的可接受规则(为了使验证器知道最好的策略) */ var validator = { // 所有用于验证规则的处理程序 arithmetic: {}, // 错误消息 messages: [], // 当前验证的配置 config: {}, // 接口方法 传入的参数是 key => value对 validate: function (data) { var i, msg, type, checker, result_ok; // 重置所有消息 this.messages = []; for (i in data) { if (data.hasOwnProperty(i)) { // 根据key查询是否有存在的验证规则 type = this.config[i]; // 获取验证规则的验证处理程序 checker = this.arithmetic[type]; // 如果验证规则不存在,则不处理 if (!type) { continue; } // 如果验证处理程序不存在,抛出异常 if (!checker) { throw { name: "ValidationError", message: "没有处理程序来验证类型 " + type } } // 验证结果 result_ok = checker.validate(data[i]); if (!result_ok) { msg = "无效值为 " + i + " ," + checker.instructions; this.messages.push(msg); } } } return !this.hasErrors(); // 验证通过了吗 }, // 帮助程序 hasErrors: function () { return this.messages.length !== 0; } }; // 算法封装 validator.arithmetic = { // 空值检测 isNonEmpty: { validate: function (value) { return value !== ""; }, instructions: "传入的值不能为空!" }, // 检测汉字 isZhCn: { validate: function (value) { return /^[\u4e00-\u9fa5]+$/.test(value); }, instructions: "请输入汉字!" }, // 检测手机号码 isTel: { validate: function (value) { return /1\d{10}/.test(value); }, instructions: "请输入正确的手机号码!" }, // 检测改值只能包含字母和数字 isAlphaNum: { validate: function (value) { return /[a-z0-9]/i.test(value); }, instructions: "传入的值只能包含字母和数字,不能包含特殊字符" } }; // 需要验证的数据 var data = { name: "name", tel: 1555 }; // 配置验证器规则 validator.config = { name: "isZhCn", tel: "isTel" }; // 测试 validator.validate(data); (function () { if (validator.hasErrors()) { //console.log(validator.messages.join("\n")); if (validator.messages.join("").indexOf("name") !== -1) { console.log("请输入汉字"); return false; } if (validator.messages.join("").indexOf("tel") !== -1) { console.log("请输入手机号码"); return false; } } })();