一個基於策略模式的程序至少由兩部分組成。
第一個部分是一組策略類,策略類封裝了具體的算法,並負責具體的計算過程。第二個部分是環境類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')); } }; });