策略模式的定義是:定義一系列的算法,把它們一個個封裝起來,並且使他們可以相互替換。
很多公司的年終獎都是與績效有關的,假如績效S的4倍工資,A的3倍,B的兩倍,寫一個函數計算員工的年終獎,最初我們的設計可能是這樣的:
var calculateBonus = function (level, salary) {
if (level === 'S') {
return salary * 4;
}
if (level === 'A') {
return salary * 3;
}
if (level === 'B') {
return salary * 2;
}
};
calculateBonus('B', 2000) // 輸出4000
這段代碼中有大量的if…else…語句,我們使用策略模式重構這段代碼:
var strategies = {
"S": function (salary) {
return salary * 4;
},
"A": function (salary) {
return salary * 3;
},
"B": function (salary) {
return salary * 2;
},
};
var calculateBonus = function (level, salary) {
return strategies[level](salary)
};
console.log(calculateBonus('S', 2000)); //輸出:8000
console.log(calculateBonus('A', 1000)); //輸出:3000
重構後的代碼,我們把各種策略的算法分離開來,在計算的時候可以通過傳入不同的參數選取不同的策略,這樣以後也可以新增其它策略,調用的時候也很方便。
策略模式的優缺點
優點:
a.策略模式利用組合、委託和多態等技術和思想,可以有效地避免多重條件判斷語句。
b.策略模式提供了對開放-封閉原則的完美支持,將算法封裝在獨立的strategy中,使得它們易於切換,易於理解,易於擴展。
c.策略模式中的算法也可以複用在系統的其他地方,從而避免許多重複的複製黏貼工作。
d.在策略模式中利用組合和委託來讓Context擁有執行算法的能力,這也是繼承的一種更輕便的替代方案。
缺點:
會增加策略對象;
要了解所有策略的不同,違反最少知識原則。