《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》之策略模式

此文章只是我自己總結(jié)下來(lái)讓自己有一天用到的時(shí)候,翻出來(lái)復(fù)習(xí)的,接受指點(diǎn),但不接受杠,誰(shuí)懟我,我懟誰(shuí)....

模式的主旨:將不變的部分和變化的部分隔開 。

定義: 一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以相互替換。

目的:將算法的使用與算法的實(shí)現(xiàn)分離開來(lái)。

策略模式種有兩個(gè)概念,策略類與環(huán)境類:
策略類: 封裝類具體的算法,并負(fù)責(zé)具體的計(jì)算過(guò)程;
環(huán)境類: 接受客戶的請(qǐng)求,隨后把請(qǐng)求委托給某一個(gè)策略類。


栗子

直接把官方的計(jì)算獎(jiǎng)金的栗子搬過(guò)來(lái)。

需求:很多公司的年終獎(jiǎng)是根據(jù)員工的工資基數(shù)和年底績(jī)效情況來(lái)發(fā)放的。例如,績(jī)效為 S 的人年終獎(jiǎng)有 4 倍工資,績(jī)效為 A 的人年終獎(jiǎng)有 3 倍工資,而績(jī)效為 B 的人年終獎(jiǎng)是 2 倍工資。假設(shè)財(cái)務(wù)部要求我們提供一段代碼,來(lái)方便他們計(jì)算員工的年終獎(jiǎng)。

在不了解策略模式之前我們實(shí)現(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 

但是,今天我們了解類策略模式,用到策略模式之后,我們實(shí)現(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ù)變多了,但是后者的好處那也是顯而易見的,在我看來(lái)最直觀的優(yōu)勢(shì)就是,代碼逼格提高了好幾個(gè)檔次。


策略模式的優(yōu)點(diǎn):
1. 策略模式利用組合、委托和多態(tài)技術(shù)和思想,可以有效地避免多重條件選擇語(yǔ)句;
2. 策略模式提供了對(duì)開放——封閉原則的完美支持,將算法封裝在獨(dú)立的環(huán)境中,使得它們易于切換,易于理解,易于擴(kuò)展;
3. 策略模式中的算法也可以復(fù)用在系統(tǒng)的其它地方,從而避免許多重復(fù)的復(fù)制粘貼工作;
4. 在策略模式中利用組合和委托來(lái)讓 Context 擁有執(zhí)行算法的能力,這也是繼承的一種更輕便的替換方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • javascript設(shè)計(jì)模式與開發(fā)實(shí)踐 設(shè)計(jì)模式 每個(gè)設(shè)計(jì)模式我們需要從三點(diǎn)問(wèn)題入手: 定義 作用 用法與實(shí)現(xiàn) 單...
    穿牛仔褲的蚊子閱讀 4,473評(píng)論 0 13
  • 在程序設(shè)計(jì)中,我們也常常遇到類似的情況,要實(shí)現(xiàn)某一個(gè)功能有多種方案可以選擇。比如一個(gè)壓縮文件的程序,既可以選擇zi...
    yufawu閱讀 438評(píng)論 0 3
  • 工廠模式 單體模式 模塊模式 代理模式 職責(zé)鏈模式 命令模式 模板方法模式 策略模式 發(fā)布-訂閱模式 中介者模式 ...
    HelloJames閱讀 1,076評(píng)論 0 6
  • 策略模式的定義:定義一系列的算法,把它們意義封裝起來(lái),并且使他們可以相互替換。 策略模式計(jì)算獎(jiǎng)金 獎(jiǎng)金發(fā)放的場(chǎng)景:...
    kim_jin閱讀 339評(píng)論 0 1
  • 策略模式的定義是:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以相互替換。 俗話說(shuō),條條大路通羅馬。在美劇...
    梅梅_1461閱讀 473評(píng)論 0 2

友情鏈接更多精彩內(nèi)容