最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 学习JavaScript设计模式之策略模式

    把不变的部分和变化的部分隔开是每个设计模式的主题。

    条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。

    一、定义

    定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
    基于策略类模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接收客户的请求,随后把请求委托给某一个策略类。

    二、示例

    计算奖金。绩效为S的发放4倍工资,绩效为A的发放3倍工资,绩效为B的发放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  验证规则
     */
    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;     // "内容长度不能超过10"
       self.cache.push(function () {
        var strategy = strategyAry.shift();   // "isMaxLength"
        strategyAry.unshift(dom.value);    // ["1@qq", "10"]
        strategyAry.push(errorMsg);     // ["1@qq", "10", "内容长度不能超过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: "内容不能为空"
     },{
      strategy: "isMaxLength:10",
      errorMsg: "内容长度不能超过10"
     },{
      strategy: "isEmail",
      errorMsg: "email格式不对"
     }]);
    errorMsg = validatorInstance.start();
    

    希望本文所述对大家学习javascript程序设计有所帮助。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 学习JavaScript设计模式之策略模式
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情