學(xué)習(xí)JavaScript設(shè)計模式之策略模式
把不變的部分和變化的部分隔開是每個設(shè)計模式的主題。
- 條條大路通羅馬。我們經(jīng)常會遇到解決一件事情有多種方案,比如壓縮文件,我們可以使用zip算法、也可以使用gzip算法。其靈活多樣,我們可以采用策略模式解決。
一、定義
定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。
基于策略類模式的程序至少由兩部分組成。第一個部分是一組策略類,策略類封裝了具體的算法,并負(fù)責(zé)具體的計算過程。第二個部分是環(huán)境類Context,Context接收客戶的請求,隨后把請求委托給某一個策略類。
二、示例
計算獎金??冃镾的發(fā)放4倍工資,績效為A的發(fā)放3倍工資,績效為B的發(fā)放2倍工資。
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", 20000));
console.log(calculateBonus("A", 20000));
console.log(calculateBonus("B", 20000));
三、延伸:表單驗證
/* 校驗策略對象 */
var validateStrategies = {
isEmpty: function (val, errorMsg) {
if (!val) {
return errorMsg;
}
},
isURL: function (val, errorMsg) {
if (!new RegExp("^(http:\\/\\/|https:\\/\\/)?([\\w\\-]+\\.)+[\\w\\-]+(\\/[\\w\\-\\.\\/?\\@\\%\\!\\&=\\+\\~\\:\\#\\;\\,]*)?$").test(val)) {
return errorMsg;
}
},
isEmail: function (val, errorMsg) {
if (!new RegExp('\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+').test(val)) {
return errorMsg;
}
},
isMaxLength: function (val, length, errorMsg) {
if (val.length > length) {
return errorMsg;
}
},
isMinLength: function (val, length, errorMsg) {
if (val.length < length) {
return errorMsg;
}
}
};
/* validator類 */
var validator = function () {
// 緩存驗證策略
this.cache = [];
};
/**
* 添加要驗證的策略
* @param dom 要驗證的dom元素
* @param rules 驗證規(guī)則
*/
validator.prototype.add = function (dom, rules) {
var self = this;
for (var i = 0, rule; rule = rules[i++];) {
(function (rule) {
var strategyAry = rule.strategy.split(":"); // ["isMaxLength", "10"]
var errorMsg = rule.errorMsg; // "內(nèi)容長度不能超過10"
self.cache.push(function () {
var strategy = strategyAry.shift(); // "isMaxLength"
strategyAry.unshift(dom.value); // ["1@qq", "10"]
strategyAry.push(errorMsg); // ["1@qq", "10", "內(nèi)容長度不能超過10"]
return validateStrategies[strategy].apply(dom, strategyAry);
});
})(rule);
}
};
/* 開始校驗 */
validator.prototype.start = function () {
for (var i = 0, validateFunc; validateFunc = this.cache[i++];) {
var errorMsg = validateFunc();
if (errorMsg) {
return errorMsg;
}
}
};
// 測試
<label for="email">郵箱:</label><input type="text" name="email" value="1@qq">
var validatorInstance = new validator();
validatorInstance.add(
document.getElementsByName("email")[0],
[{
strategy: "isEmpty",
errorMsg: "內(nèi)容不能為空"
},{
strategy: "isMaxLength:10",
errorMsg: "內(nèi)容長度不能超過10"
},{
strategy: "isEmail",
errorMsg: "email格式不對"
}]);
errorMsg = validatorInstance.start();
希望本文所述對大家學(xué)習(xí)javascript程序設(shè)計有所幫助。
- js單例模式的兩種方案
- JS實現(xiàn)單例模式的6種方案匯總
- javascript 單例模式演示代碼 javascript面向?qū)ο缶幊?/a>
- JavaScript的單例模式 (singleton in Javascript)
- 輕松掌握J(rèn)avaScript單例模式
- [js高手之路]單例模式實現(xiàn)模態(tài)框的示例
- JavaScript設(shè)計模式之策略模式詳解
- javascript設(shè)計模式--策略模式之輸入驗證
- JavaScript設(shè)計模式之策略模式實例
- 學(xué)習(xí)JavaScript設(shè)計模式(策略模式)
- javascript單例模式與策略模式實例詳解
相關(guān)文章
一起來看看JavaScript數(shù)據(jù)類型最詳解
這篇文章主要為大家詳細(xì)介紹了JavaScript數(shù)據(jù)類型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
js將當(dāng)前時間格式轉(zhuǎn)換成時間搓(自寫)
將時間轉(zhuǎn)換成時間搓的方法有很多,在本文為大家介紹下使用js將當(dāng)前時間轉(zhuǎn)換成時間搓 例如2013-09-11 12:12:12,感興趣的朋友可以參考下2013-09-09
in.js 一個輕量級的JavaScript顆?;K加載和依賴關(guān)系管理解決方案
近一年來,國內(nèi)外都十分熱衷于異步加載的研究,為了加快頁面的載入速度,無阻塞加載Javascript的方法和框架成為了前端開發(fā)的焦點和亮點之一。2011-07-07
使用JavaScript實現(xiàn)一個簡單的哈希映射功能
哈希表大家應(yīng)該都經(jīng)常用到吧,那么大家有沒有想過哈希表是怎么實現(xiàn)的呢,本文我們就來從一道簡單的題目來了解一下哈希表的簡單原理和實現(xiàn)吧2024-02-02
點擊彈出層效果&彈出窗口后網(wǎng)頁背景變暗效果的實現(xiàn)代碼
本篇文章主要是對點擊彈出層效果&彈出窗口后網(wǎng)頁背景變暗效果的實現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02
JS獲取多維數(shù)組中相同鍵的值實現(xiàn)方法示例
這篇文章主要介紹了JS獲取多維數(shù)組中相同鍵的值實現(xiàn)方法,結(jié)合實例形式分析了JS數(shù)組遍歷、判斷、鍵值獲取等操作技巧,需要的朋友可以參考下2017-01-01
關(guān)于ECharts設(shè)置x軸刻度間隔的兩種方式
這篇文章主要介紹了關(guān)于ECharts設(shè)置x軸刻度間隔的兩種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02

