【前端设计模式】之建造者模式

建造者模式是一种创建型设计模式,它允许你按照特定的步骤构建复杂对象。该模式将对象的构造过程与其表示分离,使得同样的构造过程可以创建不同的表示。

建造者模式特性

  1. 将复杂对象的构建过程分解为多个简单步骤,使得代码更加可读、可维护。
  2. 允许你通过改变构造过程中的步骤顺序或者配置来创建不同的对象。
  3. 隐藏了复杂对象的创建细节,使得客户端代码与具体对象的创建过程解耦。

应用示例

1. 创建复杂表单

假设我们需要创建一个包含多个输入字段和验证规则的表单。使用建造者模式可以将表单的构建过程分解为多个步骤,每个步骤负责添加一个字段和相应的验证规则。这样一来,我们可以根据需要自由组合字段和验证规则,而不需要关心具体的构建细节。

 
class FormBuilder {constructor() {this.fields = [];}addField(label, type, required) {this.fields.push({ label, type, required });return this;}addValidation(validationFn) {const field = this.fields[this.fields.length - 1];field.validation = validationFn;return this;}build() {return new Form(this.fields);}
}class Form {constructor(fields) {this.fields = fields;}validate() {for (const field of this.fields) {if (field.required && !field.value) {return false;}if (field.validation && !field.validation(field.value)) {return false;}}return true;}
}// 使用建造者模式创建表单
const form = new FormBuilder().addField("Username", "text", true).addValidation(value => value.length >= 6).addField("Password", "password", true).addValidation(value => value.length >= 8).build();// 验证表单
if (form.validate()) {console.log("Form is valid");
} else {console.log("Form is invalid");
}

首先,定义了一个FormBuilder类作为建造者,它有一个fields数组用于存储表单字段。

addField方法用于向fields数组中添加一个新的表单字段,包括标签(label)、类型(type)和是否必填(required)。在添加字段后,该方法返回建造者对象本身,以便进行链式调用。

addValidation方法用于向最后一个添加的表单字段添加验证函数(validationFn)。该验证函数将在表单验证时执行,判断字段的值是否满足特定条件。添加验证函数后,该方法同样返回建造者对象本身。

build方法用于创建并返回一个新的Form对象,其中包含了通过建造者配置的所有表单字段。

接下来,定义了一个Form类作为最终的对象,它接收一个包含表单字段的数组作为构造函数的参数,并将该数组存储为fields属性。

validate方法用于验证表单是否有效。它遍历fields数组中的每个字段,首先检查是否为必填字段且未填写,然后检查是否设置了验证函数且验证失败。如果有任何一个条件不满足,则返回false表示表单无效。如果所有条件都满足,则返回true表示表单有效。

最后,通过实例化FormBuilder并使用链式调用的方式添加表单字段和验证函数,然后调用build方法创建了一个新的Form对象。接下来,调用validate方法验证表单的有效性,并根据结果输出相应的消息。

2. 构建复杂的UI组件

在前端开发中,我们经常需要构建复杂的UI组件,其中包含多个子组件和配置选项。使用建造者模式可以将组件的构建过程分解为多个步骤,每个步骤负责添加一个子组件或者配置选项。这样一来,我们可以根据需要自由组合子组件和配置选项,而不需要关心具体的构建细节。

 
class ComponentBuilder {constructor() {this.children = [];this.props = {};}addChild(child) {this.children.push(child);return this;}setProps(props) {this.props = props;return this;}build() {return new Component(this.children, this.props);}
}class Component {constructor(children, props) {this.children = children;this.props = props;}render() {// 渲染组件}
}// 使用建造者模式构建复杂的UI组件
const component = new ComponentBuilder().addChild(new ChildComponent1()).addChild(new ChildComponent2()).setProps({ color: "red", size: "large" }).build();// 渲染组件
component.render();

首先,定义了ComponentBuilder类,它用于构建Component对象。ComponentBuilder具有以下方法:

  • addChild(child): 添加一个子组件到children数组中,并返回this以便链式调用。
  • setProps(props): 设置组件的属性,并将传递的props对象赋值给this.props,并返回this
  • build(): 构建并返回一个新的Component对象,该对象使用this.childrenthis.props进行初始化。

接下来,定义了Component类,它表示要构建的组件。Component具有以下方法:

  • constructor(children, props): 构造函数接受一个children数组和一个props对象,分别赋值给this.childrenthis.props
  • render(): 这是一个占位方法,可以根据具体需求实现组件的渲染逻辑。

最后,使用建造者模式来构建和配置复杂的UI组件。通过链式调用ComponentBuilder的方法来逐步构建和配置组件。

优缺点

优点
  1. 将复杂对象的构建过程分解为多个简单步骤,使得代码更加可读、可维护。
  2. 允许你通过改变构造过程中的步骤顺序或者配置来创建不同的对象。
  3. 隐藏了复杂对象的创建细节,使得客户端代码与具体对象的创建过程解耦。
缺点
  1. 建造者模式会增加代码量,因为需要定义多个类来表示不同的构建步骤和最终产品。
  2. 当需要创建的对象较少或者构建过程简单时,使用建造者模式可能会显得繁琐。

总结

建造者模式是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构造过程可以创建不同的表示。在前端开发中,可以使用建造者模式来构建复杂的表单、UI组件等。该模式的优点是使代码更加可读、可维护,并且允许根据需要自由组合构建步骤和配置选项。然而,使用建造者模式会增加代码量,并且在对象较少或者构建过程简单时可能显得繁琐。

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

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

相关文章

手写一个PrattParser基本运算解析器1: 编译原理概述

点击查看 基于Swift的PrattParser项目 编译原理概述 编译原理是我们每一个程序猿必须要了解的技能, 编译原理实际上并没有啥高深的技术, 我们如果在做业务开发, 也很少会用到编译开发的知识, 但是编译原理又是我们必备的基础知识之一. 所以我们需要对编译原理的内容有一个大概的…

【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、4路低速、2路隔离RS422数据处理平台

板卡概述 PXIE301-211A是一款基于PXIE总线架构的16路高速LVDS、4路低速LVDS采集、2路隔离RS422数据处理平台,该平台板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器,实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡…

[Hive] explode

在 Hive 中,explode 函数用于将数组(Array)或者Map类型的列拆分成多行, 每个元素或键值对为一行。这允许我们在查询中对数组或 Map 进行扁平化操作。 下面是使用 explode 函数的示例: 假设我们有一个包含数组字段的表…

pycharm操作git

pycharm操作git 之前用命令做的所有操作,使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址(http、ssh) 提交到暂存区,提交到版本库,推送到远程 直接…

Hadoop3教程(十九):MapReduce之ETL清洗案例

文章目录 (121)ETL数据清洗案例参考文献 (121)ETL数据清洗案例 ETL,即Extract-Transform-Load的缩写,用来描述数据从源端,经过抽取(Extract)、转换(transfor…

HTTP和HTTPS

目录 HTTP协议 1.HTTP协议 2.HTTP请求 URL 方法 GET请求 post请求 header报头 请求正文(body) 3.HTTP响应 结构 常见的状态码 4.form表单构造HTTP请求 5.通过ajax构造HTTP请求 6.使用工具postman ​编辑 HTTPS 1.对称加密 2.非对称加密…

填充颜色游戏

无语死了这题。 题目描述 小明最近迷上下面一款游戏。游戏开始时, 系统将随机生成一个 N N 的 正方形棋盘, 棋盘的每个格子都由六种颜色中的一种绘制。在每个步骤中, 玩家选择一种颜色, 并将与左上角连接的所有网格更改为该特…

jenkins 安装与使用、用户权限划分

jenkins 安装与使用 安装插件: 开启该插件功能 验证用户管理 创建web01~02 使用web01登录 用户权限划分 安装 Role-Based Strategy 插件后,系统管理 中多了如图下所示的一个功能,用户权限的划分就是靠他来做的 创建角色 重新访问 创建项目…

Spring Boot 3.2四个新特点提升运行性能

随着 Spring Framework 6.1 和 Spring Boot 3.2 普遍可用性的临近,我们想分享一下 Spring 团队为让开发人员优化其应用程序的运行时效率而做出的几项努力的概述。 我们将介绍以下技术和用例: Spring MVC 将使用 基于JDK 21 虚拟线程 Web 堆栈使用 Spri…

Zabbix“专家坐诊”第207期问答汇总

问题一 Q:不小心把host表删除了,怎么处理?现在使用的zabbix 4.0.3的server,agent是4.2.1,能不能不动agent的情况下升级server版本,重新部署? A:数据库有备份话恢复即可,…

SSTI模板注入(flask) 学习总结

文章目录 Flask-jinja2 SSTI 一般利用姿势SSTI 中常用的魔术方法内建函数 利用 SSTI 读取文件Python 2Python 3 利用 SSTI 执行命令寻找内建函数 eval 执行命令寻找 os 模块执行命令寻找 popen 函数执行命令寻找 importlib 类执行命令寻找 linecache 函数执行命令寻找 subproce…

华为FAT模式无线AP配置实例

硬件:AP3010DN 软件版本:VRP software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) [Huawei]dis ver Huawei Versatile Routing Platform Software VRP (R) software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) Copyright (C) 2011…

windows中elasticsearch7中添加用户名密码验证

1.找到elsatic的bin目录输入cmd 2.生成ca证书 输入 elasticsearch-certutil ca 在es7根目录生成ca证书,输入密码时直接回车即可,否则后面会报错 Please enter the desired output file [elastic-stack-ca.p12]: #这里直接回车即可 Enter password for…

JAVA学习日记1——JAVA简介及第一个java程序

简单记忆 JAVA SE :标准版,核心基础 JAVA EE:企业版,进阶 JDK:Java Development Kit,Java开发工具包,包含JRE JRE:Java Runtime Environment,Java运行时环境&#xff…

flutter 消息并发时处理,递归查询

收到新消息的时候执行receiveNewConversation方法 可以自己模拟一下两条数据插入,延时执行插入会话的操作 收到一条新的会话消息,先记录会话ID到列表,直到第一条处理完(插入数据库后清理这个会话ID),才处理…

mybatis generator 表名多了个点

csdn有一个,要收费,研究后原因如下,是 mysql不支持 SQL catalogs and schema, 解决方式就是去掉 这两个字段,同时在jdbcConnection中设置nullCatalogMeansCurrent属性为true。 手册如下 MySql does not properly supp…

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (2)

上一篇文章中: 手撕ch7/pose_estimation_3d2d(1),我们调用了epnp的方法进行位姿估计,这里我们使用非线性优化的方法来求解位姿,使用g2o进行BA优化 首先介绍g2o:可参考:g2o详细介绍 1.构建g2o图…

MLE<=> KL

MLE等价于KL散度 最大似然估计 (MLE) 和Kullback-Leibler散度 (KL散度) 之间有深厚的联系。我将先介绍两者之间的联系,然后通过一个例子进行说明。 首先,回忆一下两者的定义: 最大似然估计: θ ^ arg ⁡ max ⁡ θ L ( θ ∣ X ) \hat{\theta}\arg \m…

加权平均、EMD、小波等方法去噪效果对比

加权平均、EMD、小波等方法去噪效果对比 代码 整体代码如下 %% clear all; clc;load(data_filter120Hz.mat); %可自己生成随机噪声 fs1000;%采样频率是1000Hz %% %生成正弦波信号 tlinspace(0, length(data)/fs-1/fs, length(data)); y1 15*sin(2*pi* 2.8 *t);%生成频率为2.…

Android之使用QBadgeView给TabLayout顶部栏设置数量角标,数值可更新

TabLayout搭配ViewPager、Fragement使用可看另一篇文章&#xff1a; Android中TabLayoutViewPagerFragment实现顶部导航栏 本文主要描述给TabLayout的某一栏添加角标&#xff0c;数值可更新&#xff1a; 一、效果 二、TabLayout使用 1、xml文件中 <com.google.android.m…