什么是策略模式?
策略模式就是將一系列算法封裝起來,並使它們相互之間可以替換。被封裝起來的算法具有獨立性,外部不可改變其特性。
以計算薪資為例,屬性名為各個薪資檔位,屬性值為相應計算方法
一般開發時間較短人會想到這種寫法
var performanceS = function( salary ){ return salary * 4; }; var performanceA = function( salary ){ return salary * 3; }; var performanceB = function( salary ){ return salary * 2; }; var calculateBonus = function( performanceLevel, salary ){ if ( performanceLevel === 'S' ){ return performanceS( salary ); } if ( performanceLevel === 'A' ){ return performanceA( salary ); } if ( performanceLevel === 'B' ){ return performanceB( salary ); } }; calculateBonus( 'A' , 10000 ); // 輸出:30000
或者
var calculateBonus = function( performanceLevel, salary ){ if ( performanceLevel === 'S' ){ return salary * 4; } if ( performanceLevel === 'A' ){ return salary * 3; } if ( performanceLevel === 'B' ){ return salary * 2; } }; calculateBonus( 'B', 20000 ); // 輸出:40000 calculateBonus( 'S', 6000 ); // 輸出:24000
雖然代碼看起來簡潔,但是該函數比較龐大,包含了很多if語句,這些語句需要覆蓋所有的邏輯分支;該函數缺乏彈性,如果增加了一種新的績效等級C,或者想把績效S的獎金系數改為5,必須深入calculateBonus函數的內部實現,違反開放封閉原則
策略模式:沒有對比就沒有傷害 真香
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', 20000 ) ); // 輸出:80000 console.log( calculateBonus( 'A', 10000 ) ); // 輸出:30000