JavaScript設計模式之策略模式【組合委託】
阿新 • • 發佈:2020-08-18
>前言:語言只是工具,思想才是核心
>今天要總結的是 策略模式
策略在開發中的應用非常廣泛,所以也是非常常見且使用的設計模式。
在實際開發中,往往在實現一個功能時,有多種解決方案可行。
### 常見場景:
- 解壓: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
```
其他不多說了,一定要動過。
思路就是抽離變與不變。策略類之放不同的演算法/邏輯,使用中間類來協助發起策略類的