策略模式

策略模式的定義是:定義一系列的算法,把它們一個個封裝起來,並且使他們可以相互替換。
很多公司的年終獎都是與績效有關的,假如績效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擁有執行算法的能力,這也是繼承的一種更輕便的替代方案。
缺點:
會增加策略對象;
要了解所有策略的不同,違反最少知識原則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章