摘要:策略模式是指對(duì)一系列的算法定義,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
策略模式是指對(duì)一系列的算法定義,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
優(yōu)點(diǎn):
策略模式利用組合、委托等技術(shù)和思想,可以避免很多if條件語句
策略模式提供了開放-封閉原則,使代碼更容易理解和拓展
簡(jiǎn)單取值很多例子以績(jī)效等級(jí)和薪資計(jì)算獎(jiǎng)金為說明
let calculateBouns = (level,salary)=>{ if(level=="A"){ return salary * 1.4; }else if(level=="B"){ return salary * 1.3; }else if(level=="C"){ return salary * 1.2; }else{ return salary; } } console.log(calculateBouns("A", 8000)); //11200 console.log(calculateBouns("C", 8000)); //9600
策略模式重構(gòu)
//策略對(duì)象 class ruleA{ calculate(salary){ return salary * 1.4; } } class ruleB{ calculate(salary){ return salary * 1.3; } } class ruleC{ calculate(salary){ return salary * 1.2; } } //獎(jiǎng)金類 class Bouns{ constructor(){ this.salary = null; this.level = null; } setLevel(level){ this.level = level; } setSalary(salary){ this.salary = salary; } getBouns(){ return this.level.calculate(this.salary); } } let tom = new Bouns(),jerry = new Bouns(); //設(shè)置薪資 tom.setSalary(8000); jerry.setSalary(10000); //設(shè)置策略對(duì)象 tom.setLevel(new ruleA()); jerry.setLevel(new ruleA()); console.log(tom.getBouns()); //11200 console.log(jerry.getBouns()); //14000 jerry.setLevel(new ruleB()); console.log(jerry.getBouns()); //13000表單
還有一種理解策略模式的例子就是表單驗(yàn)證,通常會(huì)涉及到多個(gè)字段有效性判斷
let form = document.getElementById("Form"); form.onsubmit = function(){ if(form.username.value == ""){ alert("用戶名不能為空"); return false; }else if(form.username.value.length <= 6){ alert("用戶名長(zhǎng)度不能小于6位"); return false; }else if(form.password.value.length <= 6){ alert("密碼長(zhǎng)度不能小于6位"); return false; }else if(!/(^1[3|5|8][0-9]{9}$)/.test(form.phone.value)){ alert("手機(jī)號(hào)碼格式不正確"); return; }else{ submit(); } }
這樣實(shí)現(xiàn)的代碼的缺點(diǎn):
函數(shù)體積臃腫,包含了很多if判斷
函數(shù)缺乏彈性,違反了開放-封閉原則
函數(shù)復(fù)用性差,如果增加表單需要類似驗(yàn)證,只能復(fù)制一遍
策略模式實(shí)現(xiàn)表單驗(yàn)證
// 策略對(duì)象 let strategys = { isEmpty: (value,errorMsg)=> { if(value === "") { return errorMsg; } }, // 限制最小長(zhǎng)度 minLength: (value,length,errorMsg)=> { if(value.length < length) { return errorMsg; } }, // 手機(jī)號(hào)碼格式 illegalPhone: (value,errorMsg)=> { if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) { return errorMsg; } } }; class Validator{ constructor(){ this.cache = []; //保存校驗(yàn)規(guī)則 } addRule(dom,rules){ var self = this; for(let i = 0, rule; rule = rules[i++]; ){ let strategyAry = rule.strategy.split(":"); let errorMsg = rule.errorMsg; self.cache.push(function(){ let strategy = strategyAry.shift(); strategyAry.unshift(dom.value); strategyAry.push(errorMsg); return strategys[strategy].apply(dom,strategyAry); }); } } check(){ for(let i = 0, fn; fn = this.cache[i++]; ) { let msg = fn(); // 開始效驗(yàn) 并取得效驗(yàn)后的返回信息 if(msg) { return msg; } } } } // 代碼調(diào)用 let form = document.getElementById("Form"); let validateFunc = function(){ let validator = new Validator(); // 實(shí)例化Validator //添加一些校驗(yàn)規(guī)則 validator.addRule(form.username,[ {strategy: "isEmpty",errorMsg:"用戶名不能為空"}, {strategy: "minLength:6",errorMsg:"用戶名長(zhǎng)度不能小于6位"} ]); validator.addRule(form.password,[ {strategy: "minLength:6",errorMsg:"密碼長(zhǎng)度不能小于6位"}, ]); validator.addRule(form.phone,[ {strategy: "illegalPhone",errorMsg:"手機(jī)號(hào)格式不正確"}, ]); return validator.check(); }; form.onsubmit = function(){ let errorMsg = validateFunc(); if(errorMsg){ alert(errorMsg); return false; }else{ submit(); } }
策略模式屬于對(duì)象行為模式,主要針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,使得它們可以相互替換。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88923.html
摘要:將不變的部分和變化的部分隔開是每個(gè)設(shè)計(jì)模式的主題,策略模式也不例外,策略模式的目的就是將算法的使用與算法的實(shí)現(xiàn)分離開來。 前言 本系列文章主要根據(jù)《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》整理而來,其中會(huì)加入了一些自己的思考。希望對(duì)大家有所幫助。 文章系列 js設(shè)計(jì)模式--單例模式 js設(shè)計(jì)模式--策略模式 js設(shè)計(jì)模式--代理模式 概念 策略模式的定義是:定義一系列的算法,把它們一個(gè)...
摘要:策略模式定義一系列的算法把它們一個(gè)個(gè)封裝起來并且使它們可相互替換。策略模式要素策略接口,用來約束一系列具體的策略算法。策略模式策略購(gòu)買輛總金額策略購(gòu)買輛總金額策略模式優(yōu)點(diǎn)算法可以自由切換。策略模式缺點(diǎn)策略類會(huì)增多。所有策略類都需要對(duì)外暴露。 策略模式 定義一系列的算法,把它們一個(gè)個(gè)封裝起來, 并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶而變化。策略模式是把一個(gè)類中經(jīng)常改變或...
摘要:策略模式可以避免代碼中的多重判斷條件。策略模式在程序中或多或少的增加了策略類。此文僅記錄本人閱讀設(shè)計(jì)模式與開發(fā)實(shí)踐這個(gè)本時(shí)的感受,感謝作者曾探寫出這么好的一本書。設(shè)計(jì)模式中很重要的一點(diǎn)就是將不變和變分離出來。參考設(shè)計(jì)模式與開發(fā)實(shí)踐曾探 策略模式的定義是:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且是它們可以相互替換。 策略模式可以避免代碼中的多重判斷條件。 策略模式很好的體現(xiàn)了開放-...
摘要:版本策略模式在上個(gè)例子中雖然初步實(shí)現(xiàn)了策略模式,但是是仿照的傳統(tǒng)面向?qū)ο笳Z言,而的實(shí)現(xiàn)更為簡(jiǎn)單,直接把原來的實(shí)例定義成函數(shù),原先的類用函數(shù)來委托。 1. 介紹 策略模式是JS設(shè)計(jì)模式中一大重要的模式有著廣泛的應(yīng)用 2. 定義 定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可以相互替換 3. 應(yīng)用 根據(jù)等級(jí)、工資計(jì)算獎(jiǎng)金等類似情況、使用不同的動(dòng)畫效果、表單驗(yàn)證等 4. 思想 把算法實(shí)...
摘要:策略模式又稱政策模式,其定義一系列的算法,把它們一個(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...
閱讀 1442·2021-09-02 09:53
閱讀 2695·2021-07-29 13:50
閱讀 1741·2019-08-30 11:07
閱讀 1601·2019-08-30 11:00
閱讀 1478·2019-08-29 14:00
閱讀 1873·2019-08-29 12:52
閱讀 2592·2019-08-29 11:11
閱讀 3453·2019-08-26 12:23