js:策略模式

本文介绍策略模式的概念及其在表单验证中的应用。通过封装不同的验证规则并提供统一的接口,实现灵活高效的表单验证流程。展示了如何自定义验证规则及错误消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略模式

定义一系列算法,将各算法封装起来,并且可以互相替换。
即一类函数封装好后,再由一个接口函数实现根据不同参数调用不同函数。
简单理解:

    var testFuncs = {
      "A": function(a,b){ return parseInt(a) + parseInt(b);},
      "B": function(a,b){ return parseInt(a) - parseInt(b);},
      "C": function(a,b){ return parseInt(a) * parseInt(b);},
      "D": function(a,b){ return parseInt(a) / parseInt(b);}
    }
    var testInterface = function(fname, a, b){
      return testFuncs[fname](a,b);
    }

    console.log( testInterface("A", "1", "2a") );
    console.log( testInterface("B", "1", "2A") );
    console.log( testInterface("D", "1", "2D") );

应用于表单验证:

    (function(win){
      var Validator = function(){
        // 保存规则
        this.rules = {};
        // 内部添加一些规则
        // 必要性检查
        this.addRule(
          function(arr){
            if(arr[0] === "") return false;
            return true;
          }, "isRequire");
        // 最小长度检查
        this.addRule(
          function(arr){
            if(arr[0].length < arr[1]) return false;
            return true;
          }, "minLength");
        // 最大长度检查
        this.addRule(
          function(arr){
            if(arr[0].length > arr[1]) return false;
            return true;
          }, "maxLength");
        // 手机号检查
        this.addRule(
          function(arr){
            if(!(/(^1[3|5|8][0-9]{9}$)/).test(arr[0]) ) return false;
            return true;
          }, "isPhoneNum");
      }
      // 外部可 动态添加策略 
      Validator.prototype.addRule = function(fn, ruleName){
        if (this.rules[ruleName]) return true;
        this.rules[ruleName] = fn;
      }

      /**业务调用 校验接口
      * arr  [ [ruleName, [rule参数1,rule参数2.], errMsg],... ]
      */
      Validator.prototype.check = function(arr){
        var tempRule = null
          , tempCheck = null;

        for (var i=0, len = arr.length; i<len; i++){
          tempCheck = arr[i];
          if (tempCheck.length < 3) 
            throw new Error("要检查的项 " + i + ": 参数不足");
          tempRule = this.rules[tempCheck[0]];
          if (!tempRule) 
            throw new Error("未定义校验规则:" + tempCheck[0]);
          // 检查 规则校验结果,第一次遇到不满足 便退出
          if (!tempRule(tempCheck[1])){
            return tempCheck[2];
          }

          tempRule = null;
        }
        // 所有检查结束且满足规则,返回 true
        return true;
      }

      win.Validator = Validator;
    })(window);

    var validator = new Validator;
    var str1 = "sfdgdg";
    var name1 = "Asddddd";
    var phone1 = "1265554";
    var res = validator.check([
      ["isRequire", [str1], "str1 不能为空"]
    ]);
    // 不使用 != 检查
    if (res !== true){
      console.log(res);
    }else{
      console.log("验证通过"); // 输出 验证通过
    }

    res = validator.check([
      ["isRequire", [str1], "str1 不能为空"]
      ,["minLength", [name1, 6], "name1 长度至少为6。"]
      ,["maxLength", [name1, 10], "name1 长度最大为10。"]
      ,["isPhoneNum", [phone1], "phone1 不是正确的手机号。"]
    ]);

    if (res !== true){
      console.log(res); // 输出 phone1 不是正确的手机号
    }else{
      console.log("验证通过");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值