摘要:什么是策略模式策略模式,就是將不同的算法各自封裝起來,然后根據(jù)程序的不同情況,采用不同的算法,有點(diǎn)像工廠模式。在其他語言中,實(shí)現(xiàn)這樣的思路也比較費(fèi)勁,而得函數(shù)非常靈活,本來可以當(dāng)值傳遞,所以實(shí)現(xiàn)策略模式非常輕松,也很靈活。
什么是策略模式
策略模式,就是將不同的算法各自封裝起來,然后根據(jù)程序的不同情況,采用不同的算法,有點(diǎn)像工廠模式。比如在很多種情況下,都要寫ifXXX dosometing() else if XXX,這是最基本的程序邏輯寫法,但隨著情況越來越復(fù)雜,那么代碼將非常難讀,混亂不堪。
策略模式實(shí)現(xiàn)之前寫過的一個(gè)頁面就非常痛苦,是一個(gè)訂單頁加一些新功能,我是中途接手的,這個(gè)頁面大概的描述是根據(jù)不同的角色(用戶,商家,管理員)和不同的訂單狀態(tài)對頁面進(jìn)行相應(yīng)的DOM操作和提供不同的接口功能。之前情況不多,代碼也就是最簡單的if else,雖然丑陋了點(diǎn),但也沒到不可讀的地步,但隨著訂單不同的status增加到十幾種,和夾雜一些訂單不同狀態(tài)轉(zhuǎn)換前的判斷,代碼就看起來不可控了。
我嘗試用策略模式重構(gòu)代碼,先簡化一下,看看一種狀態(tài)下不同角色操作實(shí)現(xiàn):
if(role == 1){ $(".order_btn").text("查看訂單"); checkOrder(); }else if(role == 2){ $(".order_btn").text("發(fā)貨"); deilverGoods(); }else if(role == 3){ $(".order_btn").text("取消訂單"); cancelOrder(); }
1代表用戶,2代表商家,3代表管理員,隨著角色不同,相應(yīng)頁面按鈕進(jìn)行不同處理,也相應(yīng)調(diào)用不同的實(shí)現(xiàn)算法。
先嘗試將角色與操作對應(yīng)封裝:
var performanceByRole={ user:function(){ $(".order_btn").text("查看訂單"); checkOrder(); }, seller:function(){ $(".order_btn").text("發(fā)貨"); deilverGoods(); }, manage:function(){ $(".order_btn").text("取消訂單"); cancelOrder(); } }; function shiftRole(role){ if(role == 1){ return "user"; }else if(role == 2){ return "seller" }else if(role == 3){ return "manage" }; } function toDiffStrategy(role){ var funcname = shiftRole(role); performanceByRole[funcname](); } var role = fromServer(); toDiffStrategy(role);
首先把要采取的不同策略封裝在一個(gè)鍵值對里,shiftRole這個(gè)函數(shù)是“多余的”,轉(zhuǎn)換一下后臺(tái)傳給前端的數(shù)據(jù),這里即使用了if else也是可控的,因?yàn)榻巧湍敲磶讉€(gè),之后toDiffStrategy將根據(jù)傳入的不同角色,采取不同的策略算法。在其他語言中,實(shí)現(xiàn)這樣的思路也比較費(fèi)勁,而js得函數(shù)非常靈活,本來可以當(dāng)值傳遞,所以實(shí)現(xiàn)策略模式非常輕松,也很靈活。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87796.html
摘要:策略模式策略模式指的是定義一系列的算法,把它們一個(gè)個(gè)封裝起來,將不變的部分和變化的部分隔開,實(shí)際就是將算法的使用和實(shí)現(xiàn)分離出來這樣就能避免很多的條件判斷并且增強(qiáng)了代碼的復(fù)用性其中包含一個(gè)策略類和一個(gè)環(huán)境類計(jì)算獎(jiǎng)金的例子策略類環(huán)境類設(shè)置原始工 策略模式 策略模式指的是 定義一系列的算法,把它們一個(gè)個(gè)封裝起來,將不變的部分和變化的部分隔開,實(shí)際就是將算法的使用和實(shí)現(xiàn)分離出來, 這樣就能避...
摘要:策略模式可以避免代碼中的多重判斷條件。策略模式在程序中或多或少的增加了策略類。此文僅記錄本人閱讀設(shè)計(jì)模式與開發(fā)實(shí)踐這個(gè)本時(shí)的感受,感謝作者曾探寫出這么好的一本書。設(shè)計(jì)模式中很重要的一點(diǎn)就是將不變和變分離出來。參考設(shè)計(jì)模式與開發(fā)實(shí)踐曾探 策略模式的定義是:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且是它們可以相互替換。 策略模式可以避免代碼中的多重判斷條件。 策略模式很好的體現(xiàn)了開放-...
摘要:本系列為設(shè)計(jì)模式與開發(fā)實(shí)踐作者曾探學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版策略模式策略模式的定義定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可以互相替換。 本系列為《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》(作者:曾探)學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版 策略模式 策略模式的定義:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可以互相替換。 舉個(gè)形象的例子,使用策略模式計(jì)算...
摘要:策略模式又稱政策模式,其定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可以互相替換。的表單具有表單驗(yàn)證功能,用來校驗(yàn)用戶輸入的表單內(nèi)容。實(shí)際需求中表單驗(yàn)證項(xiàng)一般會(huì)比較復(fù)雜,所以需要給每個(gè)表單項(xiàng)增加自定義校驗(yàn)方法。 showImg(https://segmentfault.com/img/remote/1460000020135990); 策略模式 (Strategy Pattern...
摘要:寫代碼容易,寫出優(yōu)雅的代碼難,寫易于維護(hù)的容易擴(kuò)展的結(jié)構(gòu)清晰的代碼應(yīng)該是每位開發(fā)者努力的目標(biāo),而學(xué)習(xí)設(shè)計(jì)模式,合理的的使用能讓我們離這個(gè)目標(biāo)更進(jìn)一步。 寫代碼容易,寫出優(yōu)雅的代碼難,寫易于維護(hù)的、容易擴(kuò)展的、結(jié)構(gòu)清晰的代碼應(yīng)該是每位開發(fā)者努力的目標(biāo),而學(xué)習(xí)設(shè)計(jì)模式,合理的的使用能讓我們離這個(gè)目標(biāo)更進(jìn)一步。最近看了《Javascript設(shè)計(jì)模式與開發(fā)實(shí)踐》這本書,一言以蔽之,真不錯(cuò)的一本...
閱讀 3337·2021-11-22 12:04
閱讀 2721·2019-08-29 13:49
閱讀 493·2019-08-26 13:45
閱讀 2256·2019-08-26 11:56
閱讀 1012·2019-08-26 11:43
閱讀 605·2019-08-26 10:45
閱讀 1279·2019-08-23 16:48
閱讀 2167·2019-08-23 16:07