摘要:本系列為設(shè)計模式與開發(fā)實(shí)踐作者曾探學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版策略模式策略模式的定義定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。
本系列為《JavaScript設(shè)計模式與開發(fā)實(shí)踐》(作者:曾探)學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版
策略模式策略模式的定義:定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。
舉個形象的例子,使用策略模式計算獎金。
業(yè)務(wù)需求:
績效為S的人年終獎有4倍工資
績效為A的人年終獎有3倍工資
績效為B的人年終獎有2倍工資
財務(wù)部希望我們可以提供一段代碼,方便他們計算員工的年終獎。
最初的代碼實(shí)現(xiàn)我們可以編寫一個名為calculateBonus的函數(shù)來計算員工的獎金數(shù)額,這個函數(shù)需要傳入兩個參數(shù):工資數(shù)額和績效等級。代碼如下:
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
可以發(fā)現(xiàn),這段代碼非常簡單,但是存在著顯而易見的缺點(diǎn)。
calculateBonus函數(shù)比較龐大,包含了很多if語句,這些語句需要覆蓋所有的邏輯分支
calculateBonus函數(shù)缺乏彈性,如果增加新的績效等級,那我們必須深入calculateBonus內(nèi)部,違反了開放-封閉原則
算法的復(fù)用性差,如果在程序的其他地方需要重用這些計算獎金的算法,我們的選擇只有復(fù)制和粘貼
因此,我們要重構(gòu)這段代碼。
使用組合函數(shù)重構(gòu)代碼我們把各種算法封裝到一個個小函數(shù)里面:
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
我們的程序得到了一定的改善,但我們依然沒有解決最重要的問題:calculateBonus函數(shù)有可能越來越龐大,而且在系統(tǒng)變化的時候缺乏彈性。
使用策略模式重構(gòu)代碼將不變的部分和變化的部分隔開是每個設(shè)計模式的主題,策略模式也不例外,策略模式的目的就是將算法的使用與算法的實(shí)現(xiàn)分離開來。
一個基于策略模式的程序至少由兩部分組成,第一部分是一組策略類,策略類封裝了具體的算法,并負(fù)責(zé)具體的計算過程。第二部分是環(huán)境類Context接受客戶的請求,隨后把請求委托給某一個策略類。
現(xiàn)在我們用策略模式來重構(gòu)上邊的代碼。
//我們先把每種績效的計算規(guī)則封裝在對應(yīng)的策略類里 var porformanceS = function() {}; porformanceS.prototype.calculate = function(salary) { return salary * 4; }; var porformanceA = function() {}; porformanceA.prototype.calculate = function(salary) { return salary * 3; }; var porformanceB = function() {}; porformanceB.prototype.calculate = function(salary) { return salary * 2; }; //接下來定義獎金類Bonus: var Bonus = function() { this.salary = null; this.strategy = null; }; Bonus.prototype.setSalary = function(salary) { this.salary = salary; } Bonus.prototype.setStrategy = function(strategy) { this.strategy = strategy; } Bonus.prototype.getBonus = function() { return this.strategy.calculate(this.salary); }
在完成最終的代碼之前,我們再來回顧一下策略模式的思想:
定義一系列的算法,把它們一個個封裝起來,並且使它們可以互相替換。
如果說的更詳細(xì)一點(diǎn),就是:定義一系列的算法,把它們各自封裝成策略類,算法被封裝在策略類內(nèi)部的方法里。在客戶對Context發(fā)起請求的時候,Context總是把請求委托給這些策略對象中的某一個進(jìn)行計算。
我們繼續(xù)完成剛才的代碼:
var Bonus = new Bonus(); bonus.setSalary(1000); bonus.setStrategy(new performanceS()); bonus.getBonus();JavaScript版本的策略模式
上述代碼是模擬了一些傳統(tǒng)的面向?qū)ο笳Z言的實(shí)現(xiàn),實(shí)際上在JavaScript中,函數(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); };總結(jié)
在JavaScript語言中,策略類往往被函數(shù)所替代,這是策略模式就成為了一種隱形的模式。盡管這樣,徹底了解策略模式,也有助于我們明白使用函數(shù)的好處。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78857.html
摘要:前端每周清單第期現(xiàn)狀分析與優(yōu)化策略單元測試爬蟲作者王下邀月熊編輯徐川前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實(shí)踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000011008022); 前端每周清單第 29 期:Web 現(xiàn)狀分析與優(yōu)化策略...
摘要:設(shè)計模式與開發(fā)實(shí)踐讀書筆記。策略模式可以有效避免多重條件選擇語句。當(dāng)然,策略模式也有一些缺點(diǎn)增加了許多策略類或者策略對象。要使用策略模式,必須了解所有的,違反了最少知識原則。至此,回家咯附設(shè)計模式之發(fā)布訂閱模式觀察者模式 《JavaScript設(shè)計模式與開發(fā)實(shí)踐》讀書筆記。這本書挺好的,推薦。 俗話說,條條大路通羅馬。在現(xiàn)實(shí)生活中,我們可以采用很多方法實(shí)現(xiàn)同一個目標(biāo)。比如我們先定個小目...
摘要:策略模式可以避免代碼中的多重判斷條件。策略模式在程序中或多或少的增加了策略類。此文僅記錄本人閱讀設(shè)計模式與開發(fā)實(shí)踐這個本時的感受,感謝作者曾探寫出這么好的一本書。設(shè)計模式中很重要的一點(diǎn)就是將不變和變分離出來。參考設(shè)計模式與開發(fā)實(shí)踐曾探 策略模式的定義是:定義一系列的算法,把它們一個個封裝起來,并且是它們可以相互替換。 策略模式可以避免代碼中的多重判斷條件。 策略模式很好的體現(xiàn)了開放-...
摘要:做前端開發(fā)已經(jīng)好幾年了,對設(shè)計模式一直沒有深入學(xué)習(xí)總結(jié)過。今天第一天,首先來講策略模式。什么是策略模式四兄弟的經(jīng)典設(shè)計模式中,對策略模式的定義如下定義一系列的算法,把它們一個個封裝起來,并且使它們可互相替換。 做前端開發(fā)已經(jīng)好幾年了,對設(shè)計模式一直沒有深入學(xué)習(xí)總結(jié)過。隨著架構(gòu)相關(guān)的工作越來越多,越來越能感覺到設(shè)計模式成為了我前進(jìn)道路上的一個阻礙。所以從今天開始深入學(xué)習(xí)和總結(jié)經(jīng)典的設(shè)計模...
閱讀 1551·2023-04-26 02:29
閱讀 3016·2021-10-11 10:58
閱讀 2894·2021-10-08 10:16
閱讀 3155·2021-09-24 09:47
閱讀 1563·2019-08-29 16:56
閱讀 2711·2019-08-29 11:03
閱讀 1992·2019-08-26 13:35
閱讀 3167·2019-08-26 13:34