一个基于策略模式的程序至少由两部分组成。
第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。算法
优势:函数
策略模式利用组合、委托和多态等技术和思想,能够有效地避免多重条件选择语句。ui
策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解,易于扩展。this
策略模式中的算法也能够复用在系统的其余地方,从而避免许多重复的复制粘贴工做。prototype
在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。code
缺点:对象
首先,使用策略模式会在程序中增长许多策略类或者策略对象,但实际上这比把它们负责的逻辑堆砌在Context中要好。继承
其次,要使用策略模式,必须了解全部的strategy,必须了解各个strategy之间的不一样点,这样才能选择一个合适的strategy。好比,咱们要选择一种合适的旅游出行路线,必须先了解选择飞机、火车、自行车等方案的细节。此时strategy要向客户暴露它的全部实现,这是违反最少知识原则的。it
策略模块:(环境类)io
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')); } }; });