策略模式

定義

定義一系列的算法,把它們一個個封裝起來,並且使它們可以相互替換。

要點

  • 將不變的部分和變化的部分隔開是每個設(shè)計模式的主題,策略模式的目的就是將算法的使用(不變)與算法的實現(xiàn)(變化)分離開來。
  • 定義一系列的算法,把它們各自封裝成策略類,算法被封裝在策略類內(nèi)部的方法裡。在客戶對 Context 發(fā)起請求的時候,Context 總是把請求委託給這些策略對象中間的某一個進行計算。
  • 函數(shù)形式的策略對象
  • 策略模式也可以用來封裝一系列的「業(yè)務(wù)規(guī)則」。只要這些業(yè)務(wù)規(guī)則指向的目標(biāo)一致,並且可以被替換使用,就可以用策略模式來封裝它們。
  • 策略模式的實現(xiàn)並不複雜,關(guān)鍵是如何從策略模式的實現(xiàn)背後,找到封裝變化、委託和多態(tài)性這些思想的價值。
  • 策略模式提供了對開放-封閉原則的完美支持,將算法封裝在獨立的 strategy 中,使得它們易於切換、易於理解、易於擴展。
  • Peter Norvig:在函數(shù)作為一等對象的語言中,策略模式是隱形的。strategy 就是值為函數(shù)的變量。

核心代碼

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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容