摘要:前端設(shè)計(jì)模式策略模式解決的問(wèn)題策略模式要解決的問(wèn)題是,代碼的復(fù)用和擴(kuò)展問(wèn)題。如果沒(méi)有策略模式的代碼是將處理函數(shù)代碼與邏輯代碼混在一起寫,這樣寫的好處是一次寫好,但代碼的擴(kuò)展性與代碼的復(fù)用性不好。
@(前端)[設(shè)計(jì)模式,JavaScript,TypeScript]
策略模式解決的問(wèn)題:策略模式要解決的問(wèn)題是,代碼的復(fù)用和擴(kuò)展問(wèn)題。如果沒(méi)有策略模式的代碼是將處理函數(shù)代碼與邏輯代碼混在一起寫,這樣寫的好處是一次寫好,但代碼的擴(kuò)展性與代碼的復(fù)用性不好。
沒(méi)有用策略模式的例子代碼:
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
可以看到的缺點(diǎn)是:如果想要擴(kuò)充代碼,只能在原來(lái)的對(duì)象上插入新的代碼,對(duì)于代碼的原作者來(lái)說(shuō)這不是為題,但是對(duì)于看別人寫的代碼的人來(lái)說(shuō)這樣的代碼想要做后期的維護(hù)難度之高可想而知。為了寫出具有高復(fù)用性,好維護(hù)的,可擴(kuò)展的代碼來(lái)說(shuō)這樣的代碼風(fēng)格是不合適的。
解決問(wèn)題的思路1.分離出代碼中“變”與“不變”的部分。其中“變”的部分是啥?應(yīng)該是后續(xù)代碼中要擴(kuò)展的部分,不是將內(nèi)容固定死的代碼。而不變的部分就是代碼調(diào)用部分,通常來(lái)說(shuō)代碼中的調(diào)用部分是固定不變的。
2.所以將本來(lái)深度耦合的代碼分離出來(lái),我自己給取了名字叫條件代碼和調(diào)用代碼;條件代碼時(shí)可變的可擴(kuò)展的,通常放到外部的模塊中用來(lái)調(diào)用和提高可維護(hù)性。而調(diào)用代碼提供set和`get類方法用來(lái)設(shè)置條件代碼的運(yùn)行時(shí)需要的參數(shù)和調(diào)用調(diào)用代碼用來(lái)輸出結(jié)果。
/* 定義各種計(jì)算方式 */ class L1{ calculate(base:number){ return base*2; } } class L2{ calculate(base:number){ return base*3; } } class L3 { calculate(base: number) { return base * 4; } }調(diào)用代碼
/* 定義計(jì)算的調(diào)用方法類 */ class Calculate{ private base: number; private way: any; setBase(base: number) { this.base = base; } setLeve(leve:Object) { this.way = leve; } getResult(){ return this.way.calculate(this.base); } }業(yè)務(wù)代碼(用來(lái)輸出結(jié)果的代碼)
let calculater = new Calculate(); //實(shí)例化生成可調(diào)用對(duì)象 calculater.setBase(1000); //設(shè)置計(jì)算基礎(chǔ) calculater.setLeve( new L1() ); //設(shè)置計(jì)算的方式 console.log(calculater.getResult()); //get類方法,輸出最后的結(jié)果小結(jié)
從以上代碼可看出,擴(kuò)展可在條件代碼中擴(kuò)展。保持了代碼的高擴(kuò)展和高可維護(hù)性。
一個(gè)很好的決策模式的代碼html代碼
typescript代碼
/* 定義檢查表單的規(guī)則 */ namespace RuleList{ export const Rules: any = { "isNotEmpty": function (value: any, errMsg: string) { console.log(11); if (value === "") return errMsg; }, "minLength": function (value: any, minLength: number, errMsg: string) { console.log(22); if (value.length < minLength) return errMsg; }, "isMobile": function (value: any, errMsg: string) { console.log(33); if (!/^1[3|5|8][0-9]{9}$/.test(value)) return errMsg; } } } /* 定義檢查表單的方法類:add():添加檢查的規(guī)則; start():開(kāi)始檢查 */ class Validator { cache: object[] = []; add(dom: any, rule: string, errMsg: string) { let arr: any = rule.split(":"); this.cache.push(function () { let whichRule: string = arr.shift(); arr.unshift(dom.value); arr.push(errMsg); return RuleList.Rules[whichRule].apply(dom, arr); }); }; start() { for (let i: number = 0, func: any; i < this.cache.length; i++) { func = this.cache[i]; let msg = func(); if (msg) return msg; //如果有返回值說(shuō)明驗(yàn)證沒(méi)有通過(guò) } } } /* 策略模式的表單校驗(yàn) */ let regForm = document.querySelector("form"); let usr:any = document.querySelector("input[type=text]:first-of-type"); let pwd:any = document.querySelector("input[type=password]"); let phone:any = document.querySelector("#ph"); /* 檢查表單的函數(shù) ->1.1 */ let ValidataFunc = function(){ let validator = new Validator(); validator.add(usr, "isNotEmpty","用戶名為空"); validator.add(pwd, "isNotEmpty", "密碼為空"); validator.add(pwd, "minLength:6", "密碼小于6位"); validator.add(phone,"isMobile","號(hào)碼不是手機(jī)號(hào)碼"); let msg = validator.start(); return msg; } /* 檢查表單的函數(shù) ->1. */ if( regForm ){ regForm.onsubmit = function(){ let errMsg = ValidataFunc(); if( errMsg ){ alert(errMsg); return false; } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89955.html
摘要:策略模式介紹策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。使用策略模式的好處策略模式提供了管理相關(guān)的算法族的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試常考之設(shè)計(jì)模式——工...
摘要:設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書筆記。策略模式可以有效避免多重條件選擇語(yǔ)句。當(dāng)然,策略模式也有一些缺點(diǎn)增加了許多策略類或者策略對(duì)象。要使用策略模式,必須了解所有的,違反了最少知識(shí)原則。至此,回家咯附設(shè)計(jì)模式之發(fā)布訂閱模式觀察者模式 《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》讀書筆記。這本書挺好的,推薦。 俗話說(shuō),條條大路通羅馬。在現(xiàn)實(shí)生活中,我們可以采用很多方法實(shí)現(xiàn)同一個(gè)目標(biāo)。比如我們先定個(gè)小目...
摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
閱讀 2650·2023-04-26 02:17
閱讀 1625·2021-11-24 09:39
閱讀 1085·2021-11-18 13:13
閱讀 2663·2021-09-02 15:11
閱讀 2785·2019-08-30 15:48
閱讀 3415·2019-08-30 14:00
閱讀 2448·2019-08-29 13:43
閱讀 667·2019-08-29 13:07