设计模式-策略模式前端应用校验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
}

 

 
posted @ 2022-06-24 10:59  Myrrosego  阅读(180)  评论(0编辑  收藏  举报