成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

策略模式及在表單驗(yàn)證中的應(yīng)用

izhuhaodev / 1334人閱讀

摘要:策略模式根據(jù)不同參數(shù)可以命中不同的策略在函數(shù)是一等公民的中策略模式的使用常常隱藏在高階函數(shù)中稍微變換下上述的形式如下可以發(fā)現(xiàn)我們平時(shí)已經(jīng)在使用它了恭喜我們又掌握了一種設(shè)計(jì)模式。

策略模式

根據(jù)不同參數(shù)可以命中不同的策略

const strategy = {
  "S": function(salary) {
    return salary * 4
  },
  "A": function(salary) {
    return salary * 3
  },
  "B": function(salary) {
    return salary * 2
  }
}

const calculateBonus = function(level, salary) {
  return strategy[level](salary)
}

calculateBonus("A", 10000) // 30000

在函數(shù)是一等公民的 JS 中, 策略模式的使用常常隱藏在高階函數(shù)中, 稍微變換下上述 demo 的形式如下, 可以發(fā)現(xiàn)我們平時(shí)已經(jīng)在使用它了, 恭喜我們又掌握了一種設(shè)計(jì)模式。

  return salary * 4
}

const A = function(salary) {
  return salary * 3
}

const B = function(salary) {
  return salary * 2
}

const calculateBonus = function(func, salary) {
  return func(salary)
}

calculateBonus(A, 10000) // 30000

在一個(gè)Web項(xiàng)目中,注冊(cè),登錄,修改用戶信息,下訂單等功能的實(shí)現(xiàn)都離不開提交表單.
假設(shè)我們正在編寫一個(gè)注冊(cè)的頁面,在點(diǎn)擊注冊(cè)按鈕之前,有如下幾條校驗(yàn)邏輯。

所有選項(xiàng)不能為空

用戶名長(zhǎng)度不能少于6位

密碼長(zhǎng)度不能少于6位

手機(jī)號(hào)碼必須符合格式

郵箱地址必須符合格式
HTML代碼:


    

一般情況下的JavaScript代碼:

策略模式

使用

// 獲取表單form元素
var form = document.getElementById("f1");

// 創(chuàng)建表單校驗(yàn)實(shí)例
var validation = new Formvalidation(VerifiPolicy);
// 編寫校驗(yàn)配置
validation.add(form.username, "isNoEmpty", "用戶名不能為空");
validation.add(form.password, "minLength: 6", "密碼長(zhǎng)度不能小于6個(gè)字符");
validation.add(form.code, "isMobile", "請(qǐng)?zhí)顚懻_的手機(jī)號(hào)");

// 開始校驗(yàn),并接收錯(cuò)誤信息
var errorMsg = validation.start();

// 如果有錯(cuò)誤信息輸出,說明校驗(yàn)未通過
if(errorMsg){
    // 做一些其他的事
    return false;
}

編寫環(huán)境類

// 構(gòu)造函數(shù)
var Formvalidation = function(VerifiPolicy){
    // 保存策略對(duì)象
    this.strategies = VerifiPolicy;
    // 驗(yàn)證緩存
    this.validationFns = [];
}

// add 方法  add方法第一個(gè)參數(shù),是要驗(yàn)證的表單元素,第二個(gè)參數(shù)是一個(gè)字符串,使用 冒號(hào)(:) //分割,前面是策略方法名稱,后面是傳給這個(gè)方法的參數(shù),第三個(gè)參數(shù)仍然是錯(cuò)誤信息,
Formvalidation.prototype.add = function(dom, rule, errorMsg){

    var ary = rule.split(":");
    var arg = [];
    var self = this;
    this.validationFns.push(function(){
        arg = [];    // 重置參數(shù)
        var ruleName = ary[0];    // 策略對(duì)象方法名

        // 組裝參數(shù)
        arg.push(dom.value);
        if(ary[1]){
            arg.push(ary[1]);
        }
        arg.push(errorMsg);

        // 調(diào)用策略函數(shù)
        return self.strategies[ruleName].apply(dom, arg);
    });
}

// 開始驗(yàn)證
Formvalidation.prototype.start = function(){
    for(var i = 0; ; i++){
        var msg = this.validationFns[i]();
        if(msg){
            return msg;
        }
    }
}

編寫策略類

// 策略對(duì)象
var VerifiPolicy = {
    // 判斷是否為空
    isNoEmpty : function(value, errorMsg){
        if(value == ""){
            return errorMsg;
        }
    },
    // 判斷最小長(zhǎng)度
    minLength : function(value, length, errorMsg){
        if(value.length < length){
            return errorMsg;
        }
    },
    // 判斷是否為手機(jī)號(hào)
    isMobile : function(value, errorMsg){
        if(!/(^1[3|5|8][0-9]{9}$)/.test(value)){
            return errorMsg;
        }
    }
    // 其他
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106115.html

相關(guān)文章

  • 探索兩種優(yōu)雅的表單驗(yàn)證——策略設(shè)計(jì)模式和ES6的Proxy代理模式

    原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫博客,記錄點(diǎn)滴。 在一個(gè)Web項(xiàng)目中,注冊(cè),登錄,修改用戶信息,下訂單等功能的實(shí)現(xiàn)都離不開提交表單。這篇文章就闡述了如何編寫相對(duì)看著舒服的表單驗(yàn)證代碼。 假設(shè)我們正在編寫一個(gè)注冊(cè)的頁面,在點(diǎn)擊注冊(cè)按鈕之前,有如下幾條校驗(yàn)邏輯。 ...

    Bamboy 評(píng)論0 收藏0
  • 探索兩種優(yōu)雅的表單驗(yàn)證——策略設(shè)計(jì)模式和ES6的Proxy代理模式

    原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫博客,記錄點(diǎn)滴。 在一個(gè)Web項(xiàng)目中,注冊(cè),登錄,修改用戶信息,下訂單等功能的實(shí)現(xiàn)都離不開提交表單。這篇文章就闡述了如何編寫相對(duì)看著舒服的表單驗(yàn)證代碼。 假設(shè)我們正在編寫一個(gè)注冊(cè)的頁面,在點(diǎn)擊注冊(cè)按鈕之前,有如下幾條校驗(yàn)邏輯。 ...

    light 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式系列 - 策略模式與動(dòng)態(tài)表單驗(yàn)證

    摘要:策略模式又稱政策模式,其定義一系列的算法,把它們一個(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...

    宋華 評(píng)論0 收藏0
  • JS策略模式《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》閱讀筆記

    摘要:策略模式可以避免代碼中的多重判斷條件。策略模式在程序中或多或少的增加了策略類。此文僅記錄本人閱讀設(shè)計(jì)模式與開發(fā)實(shí)踐這個(gè)本時(shí)的感受,感謝作者曾探寫出這么好的一本書。設(shè)計(jì)模式中很重要的一點(diǎn)就是將不變和變分離出來。參考設(shè)計(jì)模式與開發(fā)實(shí)踐曾探 策略模式的定義是:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且是它們可以相互替換。 策略模式可以避免代碼中的多重判斷條件。 策略模式很好的體現(xiàn)了開放-...

    Amos 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<