【设计模式】使用策略模式优化表单校验逻辑

什么是策略?

所谓策略,就是根据已知条件决定要做出怎样的行为。

举个栗子:我要实现一个表单校验功能,要求 name 不能为空且长度必须大于 2 且小于 4,age 不能为空且必须为纯数字。

这样的判断逻辑直接用 if-else 就可以实现:

function valid() {// 表单校验逻辑if (!form.name) {alert("name 不能为空");return false;}if (form.name.length < 2) {alert("name 长度必须大于 2 ");return false;}if (form.name.length > 4) {alert("name 长度必须小于 4");return false;}if (!form.age) {alert("age 不能为空");return false;}if (!/^\d+$/.test(form.age)) {alert("age 只能为数字");return false;}return true;
}

这种实现方式有几个缺点:

  • 最终实现的 valid() 函数比较庞大,并且包含了很多 if-else 语句,需要在这里覆盖所有的校验规则。
  • 算法复用性差,如果其他地方也要进行类似的校验,就需要将这些校验逻辑到处复制粘贴。

策略模式就是为了解决这些问题而生的。

什么是策略模式?

策略模式的核心思想是将算法与使用对象分开,对象不是直接实现单个算法,而是在执行时决定要使用哪些算法。

它基于组合优于继承的原则,通过对一系列算法的封装,使它们在运行时可以互换。

这使得对象更加灵活和可重用,因为可以轻松添加或修改不同的策略,而无需更改对象的核心代码。

以上面的表单校验逻辑为例,这段代码中有四个策略: 字段不能为空字段长度必须大于x字段长度必须小于x字段只能为数字

用策略模式优化表单校验逻辑

优化思路:

  1. 隔离校验逻辑。
  2. 封装校验类,统一管理校验逻辑。

Validator 类中封装所有校验策略,并提供通用的使用接口。

class Validator {/*** 内置校验策略*/static strategy = {require(value, errorMsg) {if (value === "" || value === undefined || value === null) {return errorMsg;}},minLength(value, errorMsg, length) {if (value.length < length) {return errorMsg;}},maxLength(value, errorMsg, length) {if (value.length > length) {return errorMsg;}},number(value, errorMsg) {if (!/^\d+$/.test(value)) {return errorMsg;}},};rules = [];/*** 添加一条校验规则* @param {*} value 待校验的值* @param {*} validFn 校验方法* @param {*} errorMsg 错误信息*/add(value, validFn, errorMsg, ...args) {if (typeof validFn === "function") {this.rules.push(validFn.bind(this, value, errorMsg, ...args));} else {console.error("validFn 必须是一个函数");}}/*** 启动校验*/valid() {let length = this.rules.length;while (length--) {const rule = this.rules.shift();const errorMsg = rule();if (errorMsg) {return errorMsg;}}}
}

业务逻辑中的使用方式如下:

// 校验逻辑,返回值为错误信息,无返回值表示校验通过
function valid() {const validator = new Validator();// 给 name 设置校验规则validator.add(form.name, Validator.strategy.require, "name 不能为空");validator.add(form.name,Validator.strategy.minLength,"name 长度必须大于 2",2);validator.add(form.name,Validator.strategy.maxLength,"name 长度必须小于 4",4);validator.add(form.age, Validator.strategy.require, "age 不能为空");validator.add(form.age, Validator.strategy.number, "age 只能为数字");// 校验return validator.valid();
}

使用策略模式重构表单校验逻辑后,可以通过配置的方式就完成一个表单的校验,这些校验规则也可以更方便的复用。

总结

策略模式的优点是提高代码的灵活性和可复用性。

它的缺点是使用者必须了解所有的策略,才能选择合适的策略。

如果逻辑比较简单,使用 if-else 足以应对,就没必要用策略模式。

参考

《JavaScript 设计模式与开发实践》

Strategy pattern

A Beginner’s Guide to the Strategy Design Pattern

Strategy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全再升级,亚信安慧AntDB数据库与亚信安全二次牵手完成兼容性互认证

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;的产品与亚信科技&#xff08;成都&#xff09;有限公司&#xff08;简称&#xff1a;亚信安全&#xff09;再次携手&#xff0c;完成亚信安慧AntDB数据库与亚信安全IPoE接入认证系统…

R和Python市场篮分析算法及行为分析模型

&#x1f3af;要点 行为数据分析&#xff1a;&#x1f3af;线性统计研究生学业表现&#xff1a;&#x1f58a;绘制测试分数配对图 | &#x1f58a;构建简单线性回归模型&#xff0c;拟合数据 | &#x1f58a;构建多线性回归&#xff0c;三维可视化数据拟合模型 | &#x1f58a…

重学数论1:不定方程的引入

研究的对象&#xff1a;不定方程 文章目录 研究的对象&#xff1a;不定方程不定方程引入&#xff1a;裴蜀定理证明&#xff1a;欧几里得算法证明&#xff1a;充分性证明&#xff1a;必要性证明&#xff1a; 战术总结&#xff1a; 不定方程引入&#xff1a; 不定方程&#xff0…

「 网络安全常用术语解读 」SBOM主流格式SPDX详解

SPDX&#xff08;System Package Data Exchange&#xff09;格式是一种用于描述软件组件&#xff08;如源代码&#xff09;的规范&#xff0c;它提供了一种标准化的方法来描述软件组件的元数据&#xff0c;包括其许可证、依赖项和其他属性。SPDX最初由Linux基金会于2010年发起&…

复旦微JFM7VX690计算后IO接口模块,用于雷达信号处理、数据处理等需要高速密集计算的应用场景

计算后IO接口模块 1 介绍 1.1 产品概述 计算后IO接口模块主要由复旦微JFM7VX690型FPGA、国产以太网收发器YT8521、国产BMC芯片GD32F450、国产CPLD芯片EF2L45BG256B、国产内存颗粒等主要芯片组成&#xff0c;采用标准6U VPX尺寸设计。 本计算后IO接口模块主要用于雷达信号处…

Java面试八股之Java中数组有没有length()方法?String呢?为什么?

Java中数组有没有length()方法&#xff1f;String呢&#xff1f;为什么&#xff1f; 数组&#xff1a; 数组没有名为length()的方法&#xff0c;但有一个属性叫做length。可以通过数组名直接访问这个属性来获取数组的长度&#xff08;即元素个数&#xff09;。这是一个整数值&…

《Redis使用手册之有序集合》

《Redis使用手册之有序集合》 目录 **《Redis使用手册之有序集合》****ZADD&#xff1a;添加或更新成员****ZREM&#xff1a;移除指定的成员****ZSCORE&#xff1a;获取成员的分值****ZINCRBY&#xff1a;对成员的分值执行自增或自减操作****ZCARD&#xff1a;获取有序集合的大…

【redis】Redis数据类型(三)List类型

目录 List类型介绍特点 List数据结构附&#xff1a;3.2以前的版本(介绍一下压缩列表和双向链表)压缩列表ZipList双向链表LinkedList 常用命令lpush示例 lpushx示例 rpush示例 rpushx示例 LPOP示例 RPOP示例 BLPOP非阻塞行为阻塞行为相同的 key 被多个客户端同时阻塞在 MULTI/EX…

[笔试强训day06]

文章目录 NC10 大数乘法NC1 大数加法NC40 链表相加(二) NC10 大数乘法 NC10 大数乘法 #include <string> #include <vector> class Solution {public:string solve(string s, string t) {int m s.size(), n t.size();reverse(s.begin(), s.end());reverse(t.beg…

Matlab图像处理——基于BP神经网络的车牌标识识别系统

1. 数据集介绍 中国交通标志数据集&#xff1a; https://nlpr.ia.ac.cn/pal/trafficdata/detection.html 该数据集包含58类交通标志。 2. 数据处理 按照文件标签&#xff0c;将数据集划分了58类&#xff0c;如下&#xff1a; 对应的类别信息记录如下&#xff1a; 限速5km/…

2024 一带一路暨金砖国家技能发展与技术创新大赛【企业信息系统安全赛项】选拔赛样题

2024 一带一路暨金砖国家技能发展与技术创新大赛--企业信息系统安全赛项任务书 第一阶段&#xff1a; CTF 夺旗任务一 WEBCMS任务二 杂项 MISC任务三 Linux 应急响应分析任务四 Baby_PWN任务五 流量溯源 第二阶段&#xff1a; 企业网络安全配置与渗透需要2023环境私信博主&…

element-plus中使用el-switch时,用‘0,1’或者0,1来代替true,false绑定

介绍 switch 开关默认用 true, false来绑定的&#xff0c;但是在实际的项目中&#xff0c;有时候根据后端的接口返回&#xff0c;也可能会用字符串0 和 1 &#xff0c;或者数字 0,1来代替; 具体实现如下 详情&#xff1a; 主要实现方式是通过使用el-switch组件里的 active-val…

企业计算机服务器中了rmallox勒索病毒怎么处理,rmallox勒索病毒处理建议

在网络技术不断发展的时代&#xff0c;网络在企业中的应用广泛&#xff0c;可以为企业带来更多的便利&#xff0c;大大提升了企业的生产效率&#xff0c;但网络作为虚拟世界&#xff0c;在为企业提供便利的同时&#xff0c;也为企业数据安全带来严重威胁。近期&#xff0c;云天…

mysql 删除数据,导致存在表空间碎片的解决方法

mysql删除数据&#xff0c;导致存在表空间碎片的解决方法 1.分区表2. 使用OPTIMIZE TABLE3. 定期重建表4. 监控和维护5. 考虑其他存储引擎或数据库系统&#xff1a;6. 调整删除策略&#xff1a; 删除大量数据&#xff0c;尤其是频繁发生的删除操作&#xff0c;确实可能导致表空…

ffmpeg命令行工具安装

1. root用户安装 #!/bin/bash sudo yum install epel-release -y#由于CentOS没有官方FFmpeg rpm软件包。但是&#xff0c;我们可以使用第三方YUM源&#xff08;Nux Dextop&#xff09;完成此工作。--外网 sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro…

【YOLO改进】换遍IoU损失函数之EIoU Loss(基于MMYOLO)

EIoU损失函数 设计原理 一、IoU的局限性 IoU&#xff08;Intersection over Union&#xff09;是一种常用于评估目标检测模型性能的指标&#xff0c;特别是在计算预测边界框与真实边界框之间的重叠程度时。然而&#xff0c;IoU存在一些局限性&#xff0c;尤其是当两个边界框…

[python趣味实战]----基于python代码实现浪漫爱心 დ

正文 01-效果演示 下图是代码运行之后的爱心显示结果&#xff1a; 下面的视频该爱心是动态效果&#xff0c;较为简洁&#xff0c;如果需要使用&#xff0c;可以进行完善&#xff0c;这里只是一个趣味实战&#xff0c;下面将对代码实现进行非常详细地描述&#xff1a; 浪漫爱心…

Java数据结构-模拟实现ArrayList

MyArrayList顺序结构&#xff1a; 接口和MyArrayList重写接口 接口 接口中的方法是很多类通用的&#xff0c;所以可以写到接口中 public interface IList {public void add(int data) ;// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某个元素p…

踏上R语言之旅:解锁数据世界的神秘密码(三)

多元相关与回归分析及R使用 文章目录 多元相关与回归分析及R使用一.变量间的关系分析1.两变量线性相关系数的计算2.相关系数的假设检验 二.一元线性回归分析的R计算三、回归系数的假设检验总结 一.变量间的关系分析 变量间的关系及分析方法如下&#xff1a; 1.两变量线性相关…

LeetCode 727. 菱形

输入一个奇数 n n n&#xff0c;输出一个由 * 构成的 n n n阶实心菱形。 输入格式 一个奇数 n n n。 输出格式 输出一个由 * 构成的 n n n阶实心菱形。 具体格式参照输出样例。 数据范围 1 ≤ n ≤ 99 1≤n≤99 1≤n≤99 输入样例&#xff1a; 5输出样例&#xff1a; *…