JS设计模式--策略模式
策略模式
策略模式的定义是:定义一系列的算法,把他们一个个封装起来
JavaScript中的策略模式计算奖金
策略模式的目的就是将算法的使用与算法的实现分离开来。一个基于策略模式的程序至少由两部分组成。第一部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二部分是环境类,负责接收客户的请求,随后把请求委托给某一个策略类。
- 策略类
var strategies = { "S": function( salary ){ return salary * 4; }, "A": function( salary ){ return salary * 3; }, "B": function( salary ){ return salary * 2; } };
- 环境类
var calculateBonus = function( level, salary ){ return strategies[ level ]( salary ); }
更广义的“算法”
在实际的开发中,我们通常会把算法的含义扩散开来,使策略模式也可以封装一系列的业务规则。
策略模式实现表单校验
- 策略类
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; } } };
- 环境类Validator
var Validator = function(){ this.cache = []; }; Validator.prototype.add = function( dom, rule, errorMsg ){ var ary = rule.aplit( ':' ); this.cache.push(function(){ var strategy = ary.shift(); ary.unshift( dom.value ); ary.push( errorMsg ); return strategies[ strategy ].apply( dom, ary ); }); }; Validator.prototype.start = function(){ for ( var i = 0, validatorFunc; validatorFunc = this.cache[ i++ ]{ var msg = } }
- 调用
var validataFunc = function(){ var validator = new Validator(); validator.add( registerForm.userName, 'isNonEmpty', '用户名不能为空'); validator.add( registerForm.password, 'minLength:6', '密码长度不能少于6位'); validator.add( registerForm.phoneNumber, 'isMobile', '手机号码格式不正确'); var errorMsg = validator.start(); return errorMsg; } var registerForm = document.getElementById( 'registerFrom' ); registerForm.onsubmit = function(){ var errorMsg = validataFunc(); if ( errorMsg ){ alert ( errorMsg ); return false; } }
策略模式小结
优点:可以有效地避免多重条件选择语句;提供了开发–封闭原则;避免重复的复制粘贴工作;
缺点:在程序中增加许多策略类或者策略对象;策略要向客户暴露它的所有实现,违反最少知识原则。