此文章只是我自己總結下來讓自己有一天用到的時候,翻出來復習的系宜,接受指點俺叭,但不接受杠,誰懟我妒貌,我懟誰....
模式的主旨:將不變的部分和變化的部分隔開 通危。
定義: 一系列的算法,把它們一個個封裝起來灌曙,并且使它們可以相互替換菊碟。
目的:將算法的使用與算法的實現(xiàn)分離開來。
策略模式種有兩個概念在刺,策略類與環(huán)境類:
策略類: 封裝類具體的算法逆害,并負責具體的計算過程;
環(huán)境類: 接受客戶的請求蚣驼,隨后把請求委托給某一個策略類魄幕。
直接把官方的計算獎金的栗子搬過來。
需求:很多公司的年終獎是根據(jù)員工的工資基數(shù)和年底績效情況來發(fā)放的颖杏。例如纯陨,績效為 S 的人年終獎有 4 倍工資,績效為 A 的人年終獎有 3 倍工資,而績效為 B 的人年終獎是 2 倍工資翼抠。假設財務部要求我們提供一段代碼咙轩,來方便他們計算員工的年終獎。
在不了解策略模式之前我們實現(xiàn)的方案很可能如下:
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
但是阴颖,今天我們了解類策略模式活喊,用到策略模式之后,我們實現(xiàn)的方案完全可以如下:
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
雖然看著代碼行數(shù)變多了膘盖,但是后者的好處那也是顯而易見的胧弛,在我看來最直觀的優(yōu)勢就是,代碼逼格提高了好幾個檔次侠畔。
策略模式的優(yōu)點:
1. 策略模式利用組合结缚、委托和多態(tài)技術和思想,可以有效地避免多重條件選擇語句软棺;
2. 策略模式提供了對開放——封閉原則的完美支持红竭,將算法封裝在獨立的環(huán)境中,使得它們易于切換喘落,易于理解茵宪,易于擴展;
3. 策略模式中的算法也可以復用在系統(tǒng)的其它地方瘦棋,從而避免許多重復的復制粘貼工作稀火;
4. 在策略模式中利用組合和委托來讓 Context 擁有執(zhí)行算法的能力,這也是繼承的一種更輕便的替換方案赌朋。