摘要:策略模式可以避免代碼中的多重判斷條件。策略模式在程序中或多或少的增加了策略類。此文僅記錄本人閱讀設(shè)計(jì)模式與開發(fā)實(shí)踐這個(gè)本時(shí)的感受,感謝作者曾探寫出這么好的一本書。設(shè)計(jì)模式中很重要的一點(diǎn)就是將不變和變分離出來。參考設(shè)計(jì)模式與開發(fā)實(shí)踐曾探
策略模式的定義是:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且是它們可以相互替換。
策略模式可以避免代碼中的多重判斷條件。
策略模式很好的體現(xiàn)了開放-封閉原則,將一個(gè)個(gè)算法(解決方案)封裝在一個(gè)個(gè)策略類中。便于切換,理解,擴(kuò)展。
策略中的各種算法可以重復(fù)利用在系統(tǒng)的各個(gè)地方,避免復(fù)制粘貼。
策略模式在程序中或多或少的增加了策略類。但比堆砌在業(yè)務(wù)邏輯中要清晰明了。
違反最少知識原則,必須要了解各種策略類,才能更好的在業(yè)務(wù)中應(yīng)用。
此文僅記錄本人閱讀《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》這個(gè)本時(shí)的感受,感謝作者曾探寫出這么好的一本書。如有冒犯,如有錯(cuò)誤,請聯(lián)系本人處理。
簡單的業(yè)務(wù)場景計(jì)算員工年終獎(jiǎng)需要根據(jù)不同的員工績效計(jì)算不同的獎(jiǎng)金。例如,績效為S的人年終獎(jiǎng)有4倍工資。績效A的人年終獎(jiǎng)有3倍工資,績效B的人有2倍工資。
用代碼實(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("S", 2000) // 8000 calculateBonus("A", 2000) // 6000
其實(shí)上面一段代碼已經(jīng)能應(yīng)付目前的場景。但是,當(dāng)獎(jiǎng)金的評定需要增加一個(gè)績效C,或者改變績效A的計(jì)算方式。此時(shí)需要更改上面這個(gè)calculateBonus方法的內(nèi)部結(jié)構(gòu),如此下去,這個(gè)方法內(nèi)部將變得冗雜。
設(shè)計(jì)模式中很重要的一點(diǎn)就是將不變和變分離出來。這里變的是怎么算。不變的是根據(jù)一個(gè)績效獲得一個(gè)結(jié)果。所以上述代碼重寫,把各種算法封裝在一個(gè)個(gè)策略類中(傳統(tǒng)面向?qū)ο蟮哪7?:
var performanceS = function() {} performanceS.prototype.calc = function(salary) { return salary * 4 } var performanceA = function() {} performanceA.prototype.calc = function(salary) { return salary * 3 } var performanceB = function() {} performanceB.prototype.calc = function(salary) { return salary * 2 } //獎(jiǎng)金類Bonus var Bonus = function() { this.salary = null //原始工資 this.strategy = null // 績效等級對應(yīng)的策略對象 } Bonus.prototype.setSalary = function(salary) { this.salary = salary //設(shè)置工資 } Bonus.prototype.setStrategy = function(strategy) { this.strategy = strategy //設(shè)置員工績效對應(yīng)的策略對象 } Bonus.prototype.getBonus = function() { //獲取獎(jiǎng)金數(shù)額 return this.strategy.calc(this.salary) //把計(jì)算獎(jiǎng)金的操作委托個(gè)對應(yīng)的策略對象 } var bonus = new Bonus() bonus.setSalary(10000) bonus.setStrategy(new performanceA()) console.log(bonus.getBonus()) // 30000JavaScript版本的策略模式
在JavaScript中可以將一個(gè)個(gè)策略類寫成函數(shù),然后封裝在對象中:
// 計(jì)算獎(jiǎng)金的例子 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", 10000)) // 40000 console.log(calculateBonus("S", 20000)) // 80000更廣義的“算法”
策略模式指的是一系列的算法(策略),并且把它們封裝起來。計(jì)算獎(jiǎng)金的列子中就封裝了一些算法。其實(shí)世紀(jì)業(yè)務(wù)中也可以利用策略模式來封裝一些“業(yè)務(wù)規(guī)則”。
表單驗(yàn)證在Web項(xiàng)目中往往有很多場景需要提交表單。前端在把數(shù)據(jù)提交到后端之前,需要進(jìn)行一波表單驗(yàn)證,來減少不必要的網(wǎng)絡(luò)請求。在表單驗(yàn)證中往往會有多種校驗(yàn)規(guī)則,頁面中可能會有多個(gè)表單要進(jìn)行驗(yàn)證。此時(shí)可以用策略模式來實(shí)現(xiàn)一個(gè)表單驗(yàn)證:
總結(jié)在日常開發(fā)中一些工具函數(shù)可以封裝在一起,組成自己的工具庫。減少不必要的代碼復(fù)制粘貼。
感覺敲代碼思想更重要啦,這里策略模式體現(xiàn)了開放-封閉原則降低代碼的耦合度。這些理念都是我自己在敲代碼的路上要慢慢學(xué)習(xí)和積累的。
敲出來的代碼不能只有自己認(rèn)識。要多注意細(xì)節(jié),時(shí)刻去想哪些代碼可以再多完善。
當(dāng)然不是所有的東西都要分來分去,一個(gè)簡單的需求為了設(shè)計(jì)模式而去設(shè)計(jì)模式也是不可取的。
love & peace
參考《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》—— 曾探
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95346.html
摘要:但實(shí)際中,內(nèi)部迭代器和外部迭代器兩者并無優(yōu)劣。迭代器并不只迭代數(shù)組迭代器模式不僅能迭代數(shù)組,還可以迭代一些類數(shù)組對象。晚安了,參考設(shè)計(jì)模式與開發(fā)實(shí)踐曾探本文作者本文鏈接迭代器模式設(shè)計(jì)模式與開發(fā)實(shí)踐閱讀筆記 迭代器模式:一個(gè)相對簡單的模式,目前絕大多數(shù)語言都內(nèi)置了迭代器,以至于大家都不覺得這是一種設(shè)計(jì)模式 迭代器模式 迭代器模式指提供一種方法訪問一個(gè)聚合對象中的各個(gè)元素,而又不需要暴露該...
摘要:保護(hù)代理和虛擬代理保護(hù)代理當(dāng)有許多需求要向某對象發(fā)出一些請求時(shí),可以設(shè)置保護(hù)代理,通過一些條件判斷對請求進(jìn)行過濾。虛擬代理在程序中可以能有一些代價(jià)昂貴的操作。而虛擬代理是最常用的一種代理模式。 代理模式 代理模式是為一個(gè)對象提供一個(gè)代用品或占位符,以便控制對它的訪問。 保護(hù)代理和虛擬代理 保護(hù)代理:當(dāng)有許多需求要向某對象發(fā)出一些請求時(shí),可以設(shè)置保護(hù)代理,通過一些條件判斷對請求進(jìn)行過濾。...
某熊的技術(shù)之路指北 ? 當(dāng)我們站在技術(shù)之路的原點(diǎn),未來可能充滿了迷茫,也存在著很多不同的可能;我們可能成為 Web/(大)前端/終端工程師、服務(wù)端架構(gòu)工程師、測試/運(yùn)維/安全工程師等質(zhì)量保障、可用性保障相關(guān)的工程師、大數(shù)據(jù)/云計(jì)算/虛擬化工程師、算法工程師、產(chǎn)品經(jīng)理等等某個(gè)或者某幾個(gè)角色。某熊的技術(shù)之路系列文章/書籍/視頻/代碼即是筆者蹣跚行進(jìn)于這條路上的點(diǎn)滴印記,包含了筆者作為程序員的技術(shù)視野、...
摘要:訂閱模式的一個(gè)典型的應(yīng)用就是后面會寫一篇相關(guān)的讀書筆記。享元模式享元模式的核心思想是對象復(fù)用,減少對象數(shù)量,減少內(nèi)存開銷。適配器模式對目標(biāo)函數(shù)進(jìn)行數(shù)據(jù)參數(shù)轉(zhuǎn)化,使其符合目標(biāo)函數(shù)所需要的格式。 設(shè)計(jì)模式 單例模式 JS的單例模式有別于傳統(tǒng)面向?qū)ο笳Z言的單例模式,js作為一門無類的語言。使用全局變量的模式來實(shí)現(xiàn)單例模式思想。js里面的單例又分為普通單例和惰性單例,惰性單例指的是只有這個(gè)實(shí)例...
閱讀 933·2021-11-24 09:38
閱讀 949·2021-11-23 09:51
閱讀 2957·2021-11-16 11:44
閱讀 1792·2021-09-22 15:52
閱讀 1692·2021-09-10 11:20
閱讀 1415·2019-08-30 13:47
閱讀 1310·2019-08-29 12:36
閱讀 3342·2019-08-26 10:43