• 设计模式之策略模式,学习笔记


    比如在多个条件判断中,也许条件会被更改这样的话,我们又得重新写过,策略模式就是解决这个问题。

    var get = {
      A:function(){
        console.log('a');
      },
      B:function(){
        console.log('b');
      }
    };

    var getAB = function(why){
      return get[why]();
    };

    getAB('B');

    表单验证:

    用户名:<input type="text" name="userName" id="user">

    // 规则列表
    var obj = {
      isempty:function(val,errmsg){
        if(val===''){return errmsg;};
      },
      minLen:function(val,len,errmsg){
        if(val.length<len){return errmsg;};
      }
    };

    // 定义如何添加规律
    var v = function(){

      //保存错误信息列表
      this.count = [];
    };

    v.prototype.add = function(val,rule,errmsg){
      var arr = rule.split(':');
      if(arr.length==1){
        this.count.push(obj[rule](val,errmsg));
      }else{
        this.count.push(obj[arr[0]](val,arr[1],errmsg));
      }
    };
    //返回验证结果列表
    v.prototype.stat = function(){
      return this.count.join(',');
    };

    --------------------------------------

    //使用实例

    // 添加你需要的规律
    var c = function(dom){
      var s = new v();
      s.add(dom.value,'isempty','用户名不能为空!');
      s.add(dom.value,'minLen:3','用户名长度不能小于3');
      return s.stat();
    };


    var user = document.getElementById('user');
    user.onblur = function(){
      var msg = c(user);
      console.log(msg);
    };

    先学会怎么去用,再来编写核心代码。

    升级版,给一个元素添加多个规则


    var obj = {
      isempty:function(val,errmsg){
        if(val===''){return errmsg;};
      },
      minLen:function(val,len,errmsg){
        if(val.length<len){return errmsg;};
      }
    };


    var v = function(){
      this.count = [];
    };

    v.prototype.add = function(val,arr){
      for(var i=0;i<arr.length;i+=1){
        var rule = arr[i]['rule'].split(':');
        var r = null;
        if(rule.length===1){
          r = obj[rule[0]](val,arr[i]['errmsg']);
        }else{
          r = obj[rule[0]](val,rule[1],arr[i]['errmsg']);
        }
        r&&this.count.push(r);
      }
    };

    v.prototype.stat = function(){
      return this.count.join(',');
    };


    var c = function(dom){
      var s = new v();
      s.add(dom.value,[{rule:'isempty',errmsg:'用户名不能为空!'},{rule:'minLen:5',errmsg:'用户名长度不能小于5'}]);
      return s.stat();
    };


    var user = document.getElementById('user');
    user.onblur = function(){
      var msg = c(user);
      if(msg){
        console.log(msg);
        return false;
      }
      console.log('全部验证成功');
    };

    如果后期需要增加规律我们只需要这样


    var obj = {
      isempty:function(val,errmsg){
        if(val===''){return errmsg;};
      },
      minLen:function(val,len,errmsg){
        if(val.length<len){return errmsg;};
      },
      maxLen:function(val,len,errmsg){
        if(val.length>len){return errmsg;};
      }
    };

    var c = function(dom){
      var s = new v();
      s.add(dom.value,[{rule:'isempty',errmsg:'用户名不能为空!'},{rule:'minLen:5',errmsg:'用户名长度不能小于5个'},{rule:'maxLen:10',errmsg:'用户名长度不能超过10个'}]);
      return s.stat();
    };

      其他不变,这样话维护起来还是很方便的,虽然代码是多了点。

      小小的总结一下策略模式,当然是我个人的理解,不一定正确,原本我们把判断都写在一起,如果后期需要添加规则的话又得到里面去更改逻辑,而策略模式推荐你把这里规则单独提取出来,放到一个对象里面,你需要用到哪些规则你就添加哪些规则,这样的话,代码复用性也强,我觉得面向对象绝大部分都是在讲代码复用性。

  • 相关阅读:
    筛选IPV4地址
    linux查看磁盘空间大小df du fdisk stat命令
    编写shell脚本sum求1100累加和
    postman通过Cookies登录博客园
    Linux中mount挂载命令简洁使用方法
    linux如何查询文件及文件夹大小
    postman接口测试中添加不同的断言
    设计模式之状态模式
    Docker安装SQL Server
    架构漫谈读书笔记
  • 原文地址:https://www.cnblogs.com/pssp/p/5793119.html
Copyright © 2020-2023  润新知