定義:定義一系列的演算法,把它們乙個個封裝起來,並且使它們可以相互替換。乙個策略模式的實現至少包含兩部分:
1.策略類,封裝了具體的演算法,負責具體計算過程。
2.環境類,接收客戶的請求,將請求委託給某個策略類處理。
比如下面的場景:乙個公司需要計算年終獎,不同績效的員工年終獎計算方式不同,績效s的員工,年終獎為4倍工資,績效a年終獎為3倍工資,績效b年終獎為2倍工資。**實現:
function
calcbonus
(performancelebel, salary)
if(performancelebel ===
'a')
if(performancelebel ===
'b')
}
很簡單就完成了,但是很明顯這樣的**缺點不少:
再看看策略模式的實現,首先找到策略類和環境類:
// 具體的獎金計算過程抽離在了策略類的方法中,復用方便
const
performances
=function()
performances.prototype.
calculate
=function
(salary)
const
performancea
=function()
performancea.prototype.
calculate
=function
(salary)
const
performanceb
=function()
performanceb.prototype.
calculate
=function
(salary)
// 環境類,**請求
const
bonus
=function()
bonus.prototype.
setsalary
=function
(salary)
bonus.prototype.
setstrategy
=function
(strategy)
bonus.prototype.
getbonus
=function()
const bonus =
newbonus()
bonus.
setsalary
(1000
)bonus.
setstrategy
(new
performances()
)// 設定策略類
bonus.
getbonus()
// 4000
這是典型的物件導向做法,如果是要實現策略類,在js裡,普通的函式就可以完成了:
const stragegies =
,"a"
:function
(salary)
,"b"
:function
(salary),}
function
calcbounus
(lebel, salary)
calcbonus
('s'
,1000
)// 4000
calcbonus
('a'
,1000
)// 3000
策略模式還有乙個常用場景,就是表單驗證。 javascript策略模式
var validator 驗證型別所對應的錯誤訊息 messages 當前需要使用的驗證型別 config 暴露的公開驗證型別 validate function data if type if checker result checker.validate data i if result re...
設計模式之策略模式(javascript描述)
let calculatebyrank experience,viprank else if viprank 1 else if viprank 2 else if viprank 3 else if viprank 4 let playerexp calculatebyrank 100,2 呼叫最...
javascript設計模式 策略模式
1 var strategies 5 a function salary 8 910var getbonus function level,salary 1314 console.log getbonus s 10000 var strategies minlength function value...