首页 > 其他分享 >策略模式

策略模式

时间:2023-12-14 18:47:28浏览次数:20  
标签:function return 策略 errorMsg 校验 模式 validator var

定义策略

// 校验方法&规则配置
var strategies = {
  isNonEmpty: function( value, errorMsg ){ // 不为空
      if ( value === '' ){
          return errorMsg ;
      }
  },
  minLength: function( value, length, errorMsg ){ // 限制最小长度
      if ( value.length < length ){
          return errorMsg;
      }
  },
  isMobile: function( value, errorMsg ){ // 手机号码格式
      if ( !/(^1[3|5|8][0-9]{9}$)/.test( value ) ){
          return errorMsg;
      }
  }
};

 

 

定义校验器

// 校验执行器
var Validator = function(){
  this.cache = []; // 保存校验规则
};

 

 

定义校验器执行函数

Validator.prototype.add = function( dom, rule, errorMsg ){

  var ary = rule.split( ':' ); // 把strategy 和参数分开
  this.cache.push(function(){ // 把校验的步骤用空函数包装起来,并且放入cache
      var strategy = ary.shift(); // 用户挑选的strategy
      ary.unshift( dom.value ); // 把input 的value 添加进参数列表
      ary.push( errorMsg ); // 把errorMsg 添加进参数列表
      return strategies[ strategy ].apply( dom, ary );
  });
};

Validator.prototype.start = function(){
  for ( var i = 0, validatorFunc; validatorFunc = this.cache[ i++ ]; ){
      var msg = validatorFunc(); // 开始校验,并取得校验后的返回信息
      if ( msg ){ // 如果有确切的返回值,说明校验没有通过
          return msg;
      }
  }
};

 

 

校验器使用

// 控制器
var validataFunc = function(){
  var validator = new Validator(); // 创建一个validator 对象
  /***************添加一些校验规则****************/
  validator.add( registerForm.userName, 'isNonEmpty', '用户名不能为空' );
  validator.add( registerForm.password, 'minLength:6', '密码长度不能少于6 位' );
  validator.add( registerForm.phoneNumber, 'isMobile', '手机号码格式不正确' );
  var errorMsg = validator.start(); // 获得校验结果
  return errorMsg; // 返回校验结果
}

 

 

参考组件库

Validator.prototype.bindData = function(data) {
  this.data = data
}

Validator.prototype.addField = function(name, rule, errorMsg) {
  var that = this
  this.validateList[name] = function() {
    var ary = rule.split( ':' ); // 把strategy 和参数分开
    var strategy = ary.shift(); // 用户挑选的strategy
    ary.unshift( that.data[name] ); // 把input 的value 添加进参数列表
    ary.push( errorMsg ); // 把errorMsg 添加进参数列表
    return strategies[strategy](...ary)
  }
}
Validator.prototype.validateAll = function() {
  var that = this
  return new Promise(function(resolve, reject) {
    var validateList = Object.values(that.validateList)
    for(var i = 0; i < validateList.length; i++) {
      var result = validateList[i]();
      if(result){
        return reject({errorMsg: result});
      }
    }
    resolve(true)
  })
}
Validator.prototype.validateFields = function(...rest) {
  var fieldList = rest;
  var validateList = this.validateList
  return new Promise(function(resolve, reject) {
    if(!fieldList.length) {
      return reject('缺少参数字段')
    }
    for(var i = 0; i < fieldList.length; i++) {
      var result = validateList[fieldList[i]]();
      if(result){
        return reject({errorMsg: result});
      }
    }
    resolve(true)
  })
}

使用

var validator = new Validator();
var data = {};
validator.bindData(data);
data.name = "abc";
console.log(validator.data)
validator.addField( 'name', 'isNonEmpty', '用户名不能为空' );
validator.addField( 'password', 'minLength:6', '密码长度不能少于6位' );
validator.addField( 'phone', 'isMobile', '手机号码格式不正确' );
data.name = "abc";
data.password = "jbbjgg"
data.phone = "15993720858"
validator.validateAll().then(function(res) {
  console.log(res)
}).catch(function(error) {
  console.log(error)
})
validator.validateFields('phone').then(function(res) {
  console.log(res)
}).catch(function(error) {
  console.log(error)
})

 

 

标签:function,return,策略,errorMsg,校验,模式,validator,var
From: https://www.cnblogs.com/lijun12138/p/17901755.html

相关文章

  • Redis策略
    1.删除策略1.1.立即删除(过期后立即删除)原理:key过期之后立即删除缺点:对CPU不友好,用处理器性能换取存储空间(拿时间换空间),存在大量key同时过期占用大量CPU资源进行删除操作的情况1.2.惰性删除原理:过期后先不删除,等下一次访问时判断是否过期,若过期则立即删除缺点:对CPU不友好,用......
  • 外观模式
    外观模式,就有有一个外观类(Facade),其方法里是对多个子系统(或者其他类的对象)的操作的汇总包装,结果是外部不知道Facade具体做了哪些操作,形成比较好的隔离。主要角色就是一个外观类。示例代码:packagedesignMode.facade2;publicclassFund{Stock1stock1;Stock2stock2;......
  • Python实现软件设计模式2:工厂方法模式
    特点工厂存在父类和子类,产品存在父类和子类。工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象。包含的角色Product抽象产品ConcreteProduct具体产品Factory抽象工厂ConcreteFactory具体工厂模式分析工厂方法模式是简单工厂模式的进......
  • 组合模式
    组合模式是树形结构的管理,例如组织结构,文件系统等。组合模式有三个角色,一个是抽象构件,一个是容器构件,一个是叶子构件,容器构件和叶子构件的区别就是容器构件可以添加删除子容器或者叶子,叶子构件没有此功能。组合模式分为透明组合模式和安全组合模式,其区别是透明模式会把增加或者......
  • 适配器模式
    适配器模式分为类适配器和对象适配器。适配器有三个角色,一个是目标(Target),一个是被适配者,一个是适配者。类适配器和对象适配器的区别是,类适配器是适配者继承目标(Targer)的同时也实现被适配者的抽象接口,对象适配器是适配者只继承目标(Targer),适配者内会有一个被适配者对象。示例代......
  • JS监听系统是否为暗黑模式
    //在App.vue文件下定义即可//useDark()和useToggle()均需要安装@vueuse/core包即可使用npminstallelement-plus--save安装Element-Plusnpminstall@vueuse/core--save安装@vueuse/coreif(window.matchMedia('(prefers-color-scheme:dar......
  • 聊一聊 .NET高级调试 内核模式堆泄露
    一:背景1.讲故事前几天有位朋友找到我,说他的机器内存在不断的上涨,但在任务管理器中查不出是哪个进程吃的内存,特别奇怪,截图如下:在我的分析旅程中都是用户态模式的内存泄漏,像上图中的异常征兆已经明确告诉你了,不是用户态程序吃的内存,那就是内核态程序吃的,比如:某些驱动程序操......
  • 关于设计模式
    一、设计原则:保留不变的部分,抽取变化的部分面向接口编程多用组合,少用继承对拓展开放,对修改关闭二、设计模式1、策略模式利用多态,将变化的部分抽象成一个接口,针对该接口有不同的实现2、观察者模式主题接口和观察者接口主题维护观察者的增加、删除、通知;3、装饰者模式......
  • 软件设计模式需要考虑的原则
    1.单一职责原则(SRP,SingleResponsibilityPrinciple)一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。职责分离,提升模块的可复用性,SRP是实现高内聚、低耦合的指导方针。2.开闭原则(OCP,Open-ClosedPrinciple)软件实体应该对扩展开放,对修改关闭。表示软件实体......
  • Python实现软件设计模式1:简单工厂/静态工厂模式
    包含的角色工厂角色Factory静态方法抽象产品角色Product声明公用的抽象方法和属性具体产品角色ConcreteProduct覆盖抽象产品中声明的方法,多种产品多种覆盖模式特点可以降低系统耦合度,使用工厂方法时无需知道对象创建细节,传入工厂类的参数可以是字......