策略模式可以使程序在运行期间去选择算法。客户端始终调用暴露出的统一接口,但是可以根据不同的需求去调用不同的算法逻辑。
表单验证可以很好的解释什么是策略模式。
下面是基本实现代码:
var validator = { types: {}, messages: [], config: {}, validate: function(data){ var i, msg, type, cheaker, result; this.messages = []; for(i in data){ if(data.hasOwnProperty(i)){ type = this.config[i]; cheaker = this.types[type]; } if(!type){ continue; } if(!cheaker){ throw { name: 'ValidationError', message: 'No handler to valide type' + type } } result = cheaker.validate(data[i]); if(!result){ var msg = i + "中数据无效," + cheaker.instruction; this.messages.push(msg); } } return this.hasErrors(); }, hasErrors: function(){ return this.messages.length !== 0; } } validator.config = { name: 'isNonEmpty', age: 'isNumber' } validator.types.isNonEmpty = { validate: function(value){ return value !== ''; } } validator.types.isNumber = { validate: function(value){ return !isNaN(value); }, instruction: "必须为数字,如'1234'" } var data = { name: 'feichang', age: 'fff' } validator.validate(data); if(validator.hasErrors()){ console.log('msg:' + validator.messages.join('/n')); }
根据数据的类型在validator.config中去配置所需要的验证算法就可以完成验证。