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

news/2024/10/20 0:27:38/

什么是策略?

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

举个栗子:我要实现一个表单校验功能,要求 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.ppmy.cn/news/1442670.html

相关文章

wow-string-list文件说明

wow-string-list文件说明 项目地址&#xff1a;https://gitee.com/wow-iot/wow-iot7本文件主要功能用于字符串链表相关操作&#xff0c;主要涉及创建、销毁、插入、获取、分隔、格式转换&#xff1b; 初始化与退出: StringList_T* wow_stringlist_new(void) {return (String…

P44,45 属性预处理,执行后游戏效果回调,附录指定区域内修改变量

这节课主要是怎么对Attribute进行在进行到游戏角色前先进行处理,以及游戏效果如何回调 AuraAttributeSet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "AttributeSet.h&…

Docker搭建MySQL Workbench

MySQL Workbench 是一款图形界面工具&#xff0c;用于数据库设计、开发、管理和维护MySQL、MariaDB和Percona Server数据库。它提供了SQL开发、数据库设计、服务器配置等功能。 实际应用场景 数据库设计&#xff1a;创建ER模型&#xff0c;生成数据库架构。SQL开发&#xff1…

接口的构成

目录 接口 一、URL 二、请求方法 三、请求报文&#xff08;request message&#xff09; 3.1请求行 3.2请求头 3.3 请求体 四、响应报文&#xff08;response message&#xff09; 4.1响应行 4.2响应头 4.3响应体 接口 接口就是API&#xff0c;是程序开发的函数和方…

[97编程世界冠军4K组]代码被转为ts脚本github代码如何在WIN10运行和调试

源代码地址&#xff1a;iGitHub - SuperSodaSea/Omniscent: Analysis and Replication of Omniscent, the 1st in the Mekka & Symposium 1997 PC 4K Intro Competition. 1、软件安装nodejs和webstorm都要安装&#xff1a; node-v20.12.2-x64.msi WebStorm-2024.1.1.exe 代…

文件上传复习(upload-labs14-17关)

因为14-16关需要用到图片码&#xff0c;所以了解一下图片码 利用copy命令合成一个图片马使用_copy 图片马-CSDN博客 图片木马制作方法详细教程_如何制作图片马-CSDN博客 Pass-14&#xff08;文件包含图片马&#xff09; 首先&#xff0c;图片的格式在防护中通常是不会使用后…

应用实战 | 别踩白块小游戏,邀请大家来PK挑战~

“踩白块会输”是一个简单的微信小程序游戏&#xff0c;灵感来自当年火热的别踩白块游戏&#xff0c;程序内分成三个模块&#xff1a;手残模式、经典模式和极速模式&#xff0c;分别对应由易到难的三种玩法&#xff0c;可以查看游戏排名。动画效果采用JS实现&#xff0c;小程序…

【真实体验】使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试【YashanDB迁移体验官】

一、前言 说一下我和崖山数据库的结缘&#xff0c;大概在去年吧&#xff0c;因为我经常在墨天轮写文章&#xff0c;看到崖山数据库推出了一崖山体验官的活动&#xff0c;我就报名参加了。第一次体验了崖山数据库&#xff0c;也测试了我司数据库到崖山数据库的兼容性&#xff0…