一个基于战略形式的顺序起码由两部份构成。
第一个部份是一组战略类,战略类封装了详细的算法,并担任详细的盘算历程。第二个部份是环境类Context,Context接收客户的要求,随后把要求托付给某一个战略类。
长处:
战略形式应用组合、托付和多态等手艺和头脑,能够有效地防止多重前提挑选语句。
战略形式供应了对开放—关闭准绳的圆满支撑,将算法封装在自力的strategy中,使得它们易于切换,易于明白,易于扩大。
战略形式中的算法也能够复用在体系的其他地方,从而防止很多反复的复制粘贴事情。
在战略形式中应用组合和托付来让Context具有实行算法的才,这也是继续的一种更轻巧的替换计划。
瑕玷:
起首,运用战略形式会在顺序中增添很多战略类或许战略对象,但实际上这比把它们担任的逻辑堆砌在Context中要好。
其次,要运用战略形式,必需相识一切的strategy,必需相识各个strategy之间的不同点,如许才挑选一个适宜的strategy。比方,我们要挑选一种适宜的旅游出行线路,必需先相识挑选飞机、火车、自行车等计划的细节。此时strategy要向客户暴露它的一切完成,这是违背起码学问准绳的。
战略模块:(环境类)
define(function () {
'use strict';
var Validator = function () { };
Validator.prototype.selectValidator = function (validator) {
this.validator = validator;//validator就是考证函数
return this; //this指向validator对象
};
Validator.prototype.validate = function (value) {
if (this.validator) {
return this.validator.validate(value);//this.validator考证函数
}
throw ('No validator selected');
};
return Validator;
});
邮箱考证模块(战略类)
define(function () {
'use strict';
return {
validate: function (value) {
return value.indexOf('@') !== -1;//简朴的邮箱考证
}
};
});
号码考证模块(战略类)
define(function () {
'use strict';
return {
validate: function (value) {
return (/^[0-9]{11}$/g).test(value);//能够严谨些
}
}
});
init模块
define(function (require) {
'use strict';
return {
init: function () {
var Strategy = require('strategy/strategy'),
telValidator = require('strategy/telValidator'),
emailValidator = require('strategy/emailValidator'),
validator;
validator = new Strategy();
console.log(validator.selectValidator(telValidator).validate(012345678901));
console.log(validator.selectValidator(emailValidator).validate('test'));
}
};
});