设计模式学习(三)

2.策略模式

(要实现某一个功能有多种方案可以选择。比如一个压缩文件的程序,既可以选择 zip 算法,也可以选择 gzip 算法。这些算法灵活多样,而且可以随意互相替换。策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。)

var strategies = { 
	"S": function( salary ){ 
		return salary * 4; 
	}, 
	"A": function( salary ){ 
		return salary * 3; 
	}, 
	"B": function( salary ){ 
		return salary 
	} 
}; 
var calculateBonus = function( level, salary ){ 
	return strategies[ level ]( salary ); 
}; 
console.log( calculateBonus( 'S', 20000 ) ); // 输出:80000 
console.log( calculateBonus( 'A', 10000 ) ); // 输出:30000 


var S = function( salary ){ 
 return salary * 4; 
}; 
var A = function( salary ){ 
 return salary * 3; 
}; 
var B = function( salary ){ 
 return salary * 2; 
}; 
var calculateBonus = function( func, salary ){ 
 return func( salary ); 
}; 
calculateBonus( S, 10000 ); // 输出:40000 

2.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; 
		} 
	} 
}; 
/***********************Validator 类**************************/ 
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 strategyAry = rule.strategy.split( ':' ); 
			var errorMsg = rule.errorMsg; 
			self.cache.push(function(){ 
				var strategy = strategyAry.shift(); 
				strategyAry.unshift( dom.value ); 
				strategyAry.push( errorMsg ); 
				return strategies[ strategy ].apply( dom, strategyAry ); 
			}); 
		})( rule ) 
	} 
}; 
Validator.prototype.start = function(){ 
	for ( var i = 0, validatorFunc; validatorFunc = this.cache[ i++ ]; ){ 
		var errorMsg = validatorFunc(); 
		if ( errorMsg ){ 
			return errorMsg; 
		} 
	} 
}; 
/***********************客户调用代码**************************/ 
var registerForm = document.getElementById( 'registerForm' ); 
var validataFunc = function(){ 
	var validator = new Validator(); 
	validator.add( registerForm.userName, [{ 
		strategy: 'isNonEmpty', 
		errorMsg: '用户名不能为空' 
	}, { 
		strategy: 'minLength:6', 
		errorMsg: '用户名长度不能小于 10 位' 
	}]); 
	validator.add( registerForm.password, [{ 
		strategy: 'minLength:6', 
		errorMsg: '密码长度不能小于 6 位' 
	}]); 
	validator.add( registerForm.phoneNumber, [{ 
		strategy: 'isMobile', 
		errorMsg: '手机号码格式不正确' 
	}]); 
	var errorMsg = validator.start(); 
	return errorMsg; 
} 
registerForm.onsubmit = function(){ 
	var errorMsg = validataFunc(); 
	if ( errorMsg ){ 
		alert ( errorMsg ); 
		return false; 
	}
}; 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值