1. 程式人生 > >JavaScript設計模式之策略模式【組合委託】

JavaScript設計模式之策略模式【組合委託】

>前言:語言只是工具,思想才是核心 >今天要總結的是 策略模式 策略在開發中的應用非常廣泛,所以也是非常常見且使用的設計模式。 在實際開發中,往往在實現一個功能時,有多種解決方案可行。 ### 常見場景: - 解壓:gzip演算法解壓,gzip演算法解壓 - 表單驗證:手機號驗證,郵箱驗證,密碼格式驗證 - 工資計算:技術猛男工資,鼓勵師妹妹工資,冷血產品經理工資 ==總結策略模式的使用場景,在想實現某個效果時,有多種不同的達成方式。這個時候就要考慮策略模式(如果你寫了很多ifelse)== ### 使用策略模式的優點: - 1.使程式碼更加清晰可讀,減少繁多的if-else - 2.功能更易拓展,可維護,健壯性【單一指責,抽離變與不變。如果你看了上篇單例設計模式你就看到我也強調過這一點】 - 3.策略可重用 策略模式的應用場景: #### 場景一: 工資計算 財務妹妹想要給技術猛男、鼓勵師妹妹、冷血產品經理來統計他們本月的工資。但他們的工資計算方式不一樣呀,這可咋整? - 技術猛男:(10000基本+1000專案獎勵)* 1.2績效 - 鼓勵師妹妹:(9000基本)*1績效 - 冷血產品經理:(500基本)*1.5績效 - 【績效每月都不同】 **本著抽離變與不變的思路:** - 變:不同角色不同計算方式 - 不變:都需要計算工資 面對物件思路的寫法: ```javascript ``` 上面是模擬像Java這樣基於類的語言,而js中存在很多不一樣的特性,例如:函式即物件!所以以下是改進的 ***Js版本的策略模式。*** ```javascript ``` #### 場景二: 表單驗證(註冊賬號) 使用者在填完一堆資訊後【如:手機號、郵箱號、姓名、密碼、驗證碼】,點選註冊,此時應該先對每個欄位進行檢查,都通過後才能提交到後臺。 比較猛的寫法: ```javascript let register = function () { let name, phone, if(!name) { return; }else if (!phone || phone.length !== 11) { return; } // do register request } ``` 隨著需要檢驗的欄位越來越多,那麼else if的邏輯越來越重。並且,如果有個完善資訊頁面,同樣需要用到手機號,郵箱號這些資訊檢測怎麼複用勒? 那麼,策略模式來了: ```javascript ``` 其他不多說了,一定要動過。 思路就是抽離變與不變。策略類之放不同的演算法/邏輯,使用中間類來協助發起策略類的