標籤:blog 如何使用 使用 var 儲存 建立 訪問 strong check
策略模式的定義:定義一系列的演算法,然後根據實際情況去調用
一個小插曲:最近在項目的過程中接手了一個比較複雜的需求,由於是舊的項目用新的架構重構,所以能夠看見以前的代碼,吸取下前人代碼的精華,複用一些可用的代碼,免得自己寫半天。。當然這篇的主題是策略模式,不會離題,因為當我完成了Version 1 後,項目裡面大量的if-else 欄位的驗證都放在一個函數裡面,而且不同欄位有些還會相互影響,導致代碼很長很亂大概有幾十行的if else ,絲毫沒有條理;這個時候,需要去重構這個原本的底層驗證函式,那麼就用上了策略模式
給個策略模式放光彩的情境:驗證一行資料的每一個欄位的正確性,每一行的資料欄位假設有6個,驗證這6個欄位的正確性,返回結果
然後:假設6個欄位分別是A B C D E F;
如果不用策略模式,代碼如下:
function check(data){ //data={A: ,B: ,C: ......} if(data.A==???){ }else{ } if(data.B==???){ }else{ } if(data.C==???){ }else{ } . . .}
這是糟糕的方式,那麼進入策略模式的解決方案:
首先,策略模式意味著你要有策略,什麼是策略?就是每一種情況對應的解決方案 ;
將函數內部的每個欄位的方法抽離出來,這些一個個的判斷方法就是策略!
策略模式還有一個條件是什嗎?需要用到策略的地方能夠訪問到你的策略,抽離成函數的表現就是調用其他函數
如何組織策略?抽離成一個一個的函數,然後調用,返回結果,但是這樣子函數又顯得非常的多,難以維護,js對象字面量提供了非常優雅的解決方案
var myStrategy={ A:function(value){ //判斷 return result }, B:function(value){ //判斷 return result }, C:function(value){ //判斷 return result }, D:function(value){ //判斷 return result }, E:function(value){ //判斷 return result }, F:function(value){ //判斷 return result }}
這樣子,就建立了一個策略對象,你可以通過建立一個js檔案,儲存頁面所需要的各種策略,和底層的驗證函式,需要用到的地方再去引用這個js檔案這樣應該是比較好的方式
那麼如何使用原則?
function checke(data){ var strategy=require(‘myStrategy‘),//獲得策略對象 result={}; for(var key in data){ //假設key=A 那麼,下面執行的就是: result[key]=strategy[key](data[key]); //result.A=strategy.A( data.A ) } return result;}
超級6的有沒有,解釋下上面的行為
1,獲得策略對象
2,遍曆資料對象,拿到每一次的 key ,也就是ABCDEF這些,
3,然後去策略裡面找對應的策略方法,執行拿到返回結果
4,將結果賦給本地的result對象,裡面的key,ABCDEF,儲存著對應的欄位錯誤資訊,返回這個result對象
理解js設計模式之策略模式