天天看點

政策設計模式_設計模式之 政策模式

設計模式的出現好像都是為了解決一個問題----表現和行為分離。

政策模式的定義

封裝一系列的方法,在合适的條件下,調用相應的方法。

政策模式的代碼表現

假設我們要計算某些名額

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字----歡迎關注,點贊,轉發,評論。。。

政策設計模式_設計模式之 政策模式

繼續閱讀