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