設計模式的出現好像都是為了解決一個問題----表現和行為分離。
政策模式的定義
封裝一系列的方法,在合适的條件下,調用相應的方法。
政策模式的代碼表現
假設我們要計算某些名額
var cateIndex = { bank:function(){ return 'bank'; }, market:function(){ return 'market'; }}
在需要的地方隻需要調用對應的方法即可,cateIndex.bank()或者 cateIndex.market()
政策模式解決了什麼問題
不用政策模式的計算
function getIndex(type){ if(type=='bank'){ return 'bank' }else if(type =='market'){ return 'market' }}
假設我們的類别有很多個,我們需要在函數中不停的增加 if...else 判斷;使用政策模式可以将這些動作配置化,尤其是面對複雜場景,更能展現出來相對的優勢;
假如上面的bank類中又需要計算 收入 和 支出,則可以将bank類單獨作為一個配置提取出來
const bank = { getIncome:function(){ return 'bank-income' }, getOutPut:function(){ return 'back-outPut'; }}
在需要的地方調用bank相應的方法即可。
一個經典的例子---表單校驗
- 先建立一個政策類strategies,定義了使用者名不為空,密碼不少于6位,手機号必須符合格式的三種政策。
- 然後建立一個validataFunc對象,該對象個原型上添加一個add方法用于将相應的政策添加到validataFunc的緩存中。
- 最後,在還是校驗的時候周遊緩存中的政策,如果驗證通過則執行下一個,否則,就傳回相應的錯誤資訊。
var strategies = { isNotEmpty:function(value,errorMsg){ if(value === ''){ return errorMsg } }, minLength:function(value,length,errorMsg){ if(value.length return errorMsg } }, isMobile:function(value,errorMsg){ if(!/(^1[3|5|8][0-9]{9}$)/.test( value )){ return errorMsg } }}var validataFunc = function(){ // 建立一個 validator 對象 var validator = new Validator(); /***************添加一些校驗規則****************/ validator.add( registerForm.userName, 'isNonEmpty', '使用者名不能為空' ); validator.add( registerForm.password, 'minLength:6', '密碼長度不能少于 6 位' ); validator.add( registerForm.phoneNumber, 'isMobile', '手機号碼格式不正确' ); var errorMsg = validator.start(); // 獲得校驗結果 return errorMsg; // 傳回校驗結果}var Validator = function(){ this.cache = []; };Validator.prototype.add = function( dom, rule, errorMsg ){ var ary = rule.split( ':' ); // 把 strategy 和參數分開 this.cache.push(function(){ // 把校驗的步驟用空函數包裝起來,并且放入 cache var strategy = ary.shift(); // 使用者挑選的 strategy ary.unshift( dom.value ); // 把 input 的 value 添加進參數清單 ary.push( errorMsg ); // 把 errorMsg 添加進參數清單 return strategies[ strategy ].apply( dom, ary ); });};Validator.prototype.start = function(){ for ( var i = 0, validatorFunc; validatorFunc = this.cache[ i++ ]; ){ var msg = validatorFunc(); // 開始校驗,并取得校驗後的傳回資訊 if ( msg ){ // 如果有确切的傳回值,說明校驗沒有通過 return msg; } } };
總結
- 政策模式在工作中的應用還是比較頻繁的
- 使用時需要先思考需要将那些部分作為政策對象及政策方法
- 能夠将部分代碼配置化,代碼閱讀起來更加清晰明了
我是喜妹子小七,每篇文章盡量不超過1000字----歡迎關注,點贊,轉發,評論。。。