定義
定義一系列的算法,把它們一個個封裝起來,並且使它們可以相互替換。
要點
- 將不變的部分和變化的部分隔開是每個設計模式的主題,策略模式的目的就是將算法的使用(不變)與算法的實現(變化)分離開來。
- 定義一系列的算法,把它們各自封裝成策略類,算法被封裝在策略類內部的方法裡。在客戶對 Context 發起請求的時候,Context 總是把請求委託給這些策略對象中間的某一個進行計算。
- 函數形式的策略對象
- 策略模式也可以用來封裝一系列的「業務規則」。只要這些業務規則指向的目標一致,並且可以被替換使用,就可以用策略模式來封裝它們。
- 策略模式的實現並不複雜,關鍵是如何從策略模式的實現背後,找到封裝變化、委託和多態性這些思想的價值。
- 策略模式提供了對開放-封閉原則的完美支持,將算法封裝在獨立的 strategy 中,使得它們易於切換、易於理解、易於擴展。
- Peter Norvig:在函數作為一等對象的語言中,策略模式是隱形的。strategy 就是值為函數的變量。
核心代碼
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);
};
calculateBonus('S', 20000);
\\ 隱形的策略模式
var S = function(salary) {
return salary * 4;
};
var A = function(salary) {
return salary * 3;
};
var B = function(salary) {
return salary * 2;
};
var calculateBonus = function(fn, salary) {
return fn(salary);
};
calculateBonus(S, 20000);