一个基于策略模式的程序至少由两部分组成。
第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类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'));
}
};
});
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。