设计模式-策略模式前端应用校验vue写法
1、定义:定义一系列算法,把它们一个个封装起来,并且它们可以相互替换
2、实际应用:减少if else的使用,在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护,提高维护和可读性,具备扩展性
使用案例
优化前写法
    if (this.code.length != 16) {
        if (this.code.length == 0) {
          Toast({
            message: '请输入兑换码或者选择扫描兑换码',
            position: 'middle',
            duration: 3000
          })
          return false
        } else {
          Toast({
            message: '请输入正确的兑换码',
            position: 'middle',
            duration: 1500
          })
        }
      } else if (!validateMobile(this.userTel)) {
        Toast({
          message: '请输入正确的手机号',
          position: 'middle',
          duration: 1500
        })
      } else if (this.codeVal.length == 0) {
        Toast({
          message: '请输入短信验证码',
          position: 'middle',
          duration: 1500
        })
      } else if (this.codeVal.length < 4) {
        Toast({
          message: '请输入正确的短信验证码',
          position: 'middle',
          duration: 1500
        })
      }
优化后的写法-采用策论模式+构造函数
我是建一个check.js文件,具体页面引用import { validateCodeFunc } from '@/assets/js/check'
第一步把所有的策略封装起来
const strategys = {
    // 空检验
  isNotEmpty: (value, errorMsg) => {
    if (value === '') return errorMsg
  },
    // 16位数字code
  codeLength: (value, errorMsg) => {
    if (!/^\d{16}$/.test(value)) return errorMsg
  },
    // 4位验证码
  verificationCodeLength: (value, length, errorMsg) => {
    if (value.length != length) return errorMsg
  },
    // 手机号
  mobileFormat: (value, errorMsg) => {
    if (!/^1[3456789]\d{9}$/.test(value)) return errorMsg
  }
}
第二步创建调用策略的环境,需要使用那种策略
export function Validator() {
  this.cache = []  // 保存效验规则
}
Validator.prototype.add = function(value, rule, errorMsg) {
  var str = rule.split(':')  // str 返回的是 [verificationCodeLength,4]
  this.cache.push(function() {
    var strategy = str.shift()// 方法名
    str.unshift(value) // value添加进参数列表
    str.push(errorMsg)  // 把errorMsg添加进参数列表
    return strategys[strategy].apply(value, str)
  })
}
Validator.prototype.start = function() {
  for (var i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
    var msg = validatorFunc()  // 开始效验 并取得效验后的返回信息
    if (msg) {
      return msg
    }
  }
}
第三步最后创建一个Validator实例,在具体页面调用即可
export function validateMobileFunc(params) {
  const validator = new Validator()
  validator.add(params.userTel, 'isNotEmpty', '请输入手机号')
  validator.add(params.userTel, 'mobileFormat', '请输入正确格式的手机号')
  validator.add(params.codeVal, 'isNotEmpty', '请输入验证码')
  validator.add(params.codeVal, 'verificationCodeLength:4', '请输入正确格式的验证码')
  var errorMsg = validator.start()
  return errorMsg
}
设计模式-策略模式前端应用校验vue写法的更多相关文章
- 15. 星际争霸之php设计模式--策略模式
		题记==============================================================================本php设计模式专辑来源于博客(jymo ... 
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
		[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ... 
- linkin大话设计模式--策略模式
		linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ... 
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
		[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ... 
- javascript设计模式——策略模式
		前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ... 
- 在商城系统中使用设计模式----策略模式之在spring中使用策略模式
		1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ... 
- [转]js设计模式-策略模式
		在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方案就是本文 ... 
- 设计模式-策略模式(Strategy Model)
		1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ... 
- java设计模式 策略模式Strategy
		本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ... 
随机推荐
- @JsonFormat、@DateTimeFormat、@JsonSerialize注解的使用
			@JsonFormat 是jackson的注解,用于后台返回前台的时候将后台的date类型数据转为string类型格式化显示在前台,加在get方法或者date属性上面,因为 @JsonFormat 注 ... 
- JavaScript学习总结1-字符、数字
			1.严格检查模式 JavaScript是一种十分随便自由的语言 1 <script> 2 console.log(i); 3 </script> 即使没有定义i变量,也能在控制 ... 
- 缓存中间件-Redis(二)
			在上一篇中我们简单总结和介绍了Redis的几个方面 1.使用Redis背景 2.Redis通信多路复用的基本原理 3.Redis基本数据结构 4.Redis持久化方式 这一篇我们使用简单的业务场景来介 ... 
- SQL注入绕过总结
			花括号绕过 select{x password}from{database.user} union select 1,{x 2},3 特征字符大小写绕过 UniOn SEleCt 1,2,3 MYSQ ... 
- Istio实践(4)- 故障注入、熔断及ServiceEntry
			前言:接上一篇istio多服务应用部署及调用,本文介绍通过流量管理(故障注入.请求超时等)以及ServiceEntry外部服务部署应用 1.设置服务延迟 修改springbootapp-vs-v1.y ... 
- 服务器安全加固 - Linux
			一.账号和口令 1.1 禁用或删除无用账号 查看 /etc/passwd 文件查看是否有无用的账号,如果存在则删除,降低安全风险. 操作步骤: 使用命令 userdel <用户名> 删除不 ... 
- ucore lab5 用户进程管理 学习笔记
			近几日睡眠质量不佳,脑袋一困就没法干活,今天总算时补完了.LAB5难度比LAB4要高,想要理解所有细节时比较困难.但毕竟咱不是要真去写一个OS,所以一些个实现细节就当成黑箱略过了. 这节加上了用户进程 ... 
- Linux-编译安装http-实验
			准备工作 1.关闭防火墙和SELinux 2.基础安装的系统,安装以下命令 yum install gcc make autoconf gcc-c++ glibc glibc-devel pcre p ... 
- ONNXRuntime学习笔记(四)
			接上一篇在Python端的onnx模型验证结果,上一篇在Pytorch和onnxruntime-gpu推理库上分别进行效果效率统计分析,结论要比最初设置的50ms高很多,这一篇我将在C++端写个测试代 ... 
- VUE3 之 自定义指令的实现 - 这个系列的教程通俗易懂,适合新手
			1. 概述 老话说的好:能屈能伸的人生,才是完满而丰富的人生. 言归正传,今天我们来聊聊 VUE 中自定义指令的实现. 2. 自定义指令 2.1 文本框聚焦的实现 <body> < ... 
