javascript设计模式:策略模式
前言
- 策略模式有效利用组合、委托、多态等技术和思想,可以有效避免多重条件选择语句。
- 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换、理解、扩展。
- 策略模式中的算法也可以复用在系统的其他地方,从而有效的减少了复制粘贴工作。
- 策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。
计算奖金
1 var strategies={ 2 "s":function(salary){ 3 return salary*4; 4 }, 5 "a":function(salary){ 6 return salary*2; 7 } 8 } 9 10 var getBonus=function(level,salary){ 11 return strategies[level](salary); 12 } 13 14 console.log(getBonus("s",10000));
表单验证
var strategies={ isNonEmpty: function( value, errorMsg ){ // 不为空 if ( value === '' ){ return errorMsg ; } }, minLength: function( value, length, errorMsg ){ // 限制最小长度 if ( value.length < length ){ return errorMsg; } }, isMobile: function( value, errorMsg ){ // 手机号码格式 if ( !/(^1[3|5|8][0-9]{9}$)/.test( value ) ){ return errorMsg; } } } var registerForm=document.getElementById("registerForm"); 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 ary=rule.strategy.split(':'); var err=rule.errMsg; self.cache.push(function(){ var strategy=ary.shift(); //数组第一个元素就是验证策略 ary.unshift(dom.value); ary.push(err); return strategies[strategy].apply(dom,ary); }); })(rule) } } Validator.prototype.start=function(){ for(var i=0,validatorFunc;validatorFunc=this.cache[i++];){ var err = validatorFunc(); if(err){ return err; } } } var validatorFunc= function(){ var validator = new Validator(); validator.add(registerForm.username,[ { 'strategy':'isNonEmpty', 'errMsg':'用户名不能为空' } , { 'strategy':'minLength:6', 'errMsg':'用户名长度不能小于6' }]); validator.add(registerForm.password,[ { 'strategy':'minLength:6', 'errMsg':'密码长度不能小于6' } ]) var err = validator.start(); return err; } registerForm.onsubmit=function(){ var err = validatorFunc(); if(err){ alert(err); return false; } }
总结
策略模式的关键总结为三点:封装策略(也就是算法中变化的部分)、策略上下文(Context)、客户端调用。 其中上下文也起一个调度作用。
策略模式这两个demo中,其中还用到了js call和apply、闭包特性。
博客地址: | http://www.cnblogs.com/sword-successful/ |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。 |