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写法的更多相关文章

  1. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)

    [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...

  3. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  4. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  5. javascript设计模式——策略模式

    前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ...

  6. 在商城系统中使用设计模式----策略模式之在spring中使用策略模式

    1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...

  7. [转]js设计模式-策略模式

    在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方案就是本文 ...

  8. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

  9. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

随机推荐

  1. CesiumJS 2022^ 原理[2] 渲染架构之三维物体 - 创建并执行指令

    目录 回顾 预备知识:指令 预备知识:通道 1. 生成并执行指令 1.1. Primitive 生成指令 1.2. Context 对象负责执行 WebGL 底层代码 2. 多段视锥体技术 3. 指令 ...

  2. 整理display:none;和visibility:hidden;和overflow:hidden;的区别

    1.display:none;  这个属性隐藏元素,不占网页任何空间,彻底隐藏,消失 2.visibility:hidden;  占据空间,但是无法点击.隐藏了这个层,看不到,却能摸得着 3.over ...

  3. 【LeetCode】49. 字母异位词分组

    49. 字母异位词分组 知识点:字符串:哈希表 题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源 ...

  4. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

  5. Java中日期格式化的实现算法

    package com.study.test; import java.io.Serializable; import java.text.SimpleDateFormat; import java. ...

  6. Rancher无法登录 容器报错X509:certificate has expired or is not ye valid

    在某天需要发布新版本的时候,发现rancher无法登录,于是到服务器上查看rancher日志,发现以下内容:  参考rancher文档中独立容器Rancher Server证书更新解决 1. 进入容器 ...

  7. PicLite 开发日志 (v0.0.3)

    PicLite 开发日志 (v0.0.3) 感谢您阅读本片文章! Gitee 地址:https://gitee.com/XiaoQuQuSD/pic-lite. 新增功能 当错误出现时不再强制 rai ...

  8. ImageView的scaleType属性 与 adjustViewBounds属性

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  9. JS 中 对象 基础认识

    俗话说:"万物皆对象",在 Javascript  中除了原始值几乎所有的东西都可以看做对象: 布尔是对象( new 关键词定义) 数字是对象( new 关键词定义) 字符串是对象 ...

  10. tuandui last

    组长博客链接### 组长博客 参考邹欣老师的问题模板进行总结思考### 设想和目标(2分)#### 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 ...