JS设计模式--策略模式

JS设计模式--策略模式

  • 策略模式
    • JavaScript中的策略模式计算奖金
    • 更广义的“算法”
      • 策略模式实现表单校验
    • 策略模式小结

策略模式

策略模式的定义是:定义一系列的算法,把他们一个个封装起来

JavaScript中的策略模式计算奖金

策略模式的目的就是将算法的使用与算法的实现分离开来。一个基于策略模式的程序至少由两部分组成。第一部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二部分是环境类,负责接收客户的请求,随后把请求委托给某一个策略类。

  1. 策略类
     	var strategies = {
     		"S": function( salary ){
     			return salary * 4;
     		},
     		"A": function( salary ){
     			return salary * 3},
     		"B": function( salary ){
     			return salary * 2;
     		}
     	};
    
  2. 环境类
     	var calculateBonus = function( level, salary ){
     		return strategies[ level ]( salary );
     	}
    

更广义的“算法”

在实际的开发中,我们通常会把算法的含义扩散开来,使策略模式也可以封装一系列的业务规则。

策略模式实现表单校验

  1. 策略类
    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;
    		}
    	}
    };
    
    1. 环境类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 = 
    	}
    }
    
    1. 调用
    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;
    	}
    }
    

策略模式小结

优点:可以有效地避免多重条件选择语句;提供了开发–封闭原则;避免重复的复制粘贴工作;
缺点:在程序中增加许多策略类或者策略对象;策略要向客户暴露它的所有实现,违反最少知识原则。

你可能感兴趣的:(JS设计模式)