【前端设计模式】之状态模式

引言

在前端开发中,我们经常需要处理复杂的应用状态。这时候,状态模式就能派上用场了。状态模式允许我们根据不同的状态来改变对象的行为,从而实现优雅地管理应用状态。

状态模式的特性

状态模式具有以下特性:

  1. 状态(State):定义了对象在特定条件下所处的行为和属性。
  2. 上下文(Context):维护一个对当前状态对象的引用,并将请求委托给当前状态处理。
  3. 具体状态(Concrete State):实现了特定条件下对象行为和属性的具体逻辑。
  4. 状态转换:根据条件或事件触发,对象可以在不同的具体状态之间进行转换。

前端应用示例

在前端开发中,我们可以使用状态模式来解决以下问题,并提供相应的代码示例:

1. 表单验证

在处理表单验证时,状态模式可以帮助我们根据不同的验证规则来改变表单的行为和样式。

 
// 定义状态接口
class State {handleInput(context, input) {throw new Error("handleInput() method must be implemented");}
}
// 定义具体状态类
class ValidState extends State {handleInput(context, input) {if (input.length < 5) {context.setState(new InvalidState());} else {context.setValue(input);}}
}
class InvalidState extends State {handleInput(context, input) {if (input.length >= 5) {context.setState(new ValidState());}}
}
// 定义上下文类
class FormContext {constructor() {this.state = new ValidState();this.value = "";}setState(state) {this.state = state;}setValue(value) {this.value = value;console.log("Value is valid:", this.value);// 更新表单样式等操作}handleInput(input) {this.state.handleInput(this, input);}
}
// 使用示例
const formContext = new FormContext();
formContext.handleInput("Hello"); // 输出: "Value is valid: Hello"
formContext.handleInput("Hi"); // 不输出

这段代码定义了一个表单的上下文类FormContext以及两个状态类ValidStateInvalidState

FormContext类中维护了一个当前状态state和表单值value。它提供了setState()方法用于设置新的状态,setValue()方法用于设置表单值并输出验证结果,以及handleInput()方法用于处理用户输入。

ValidStateInvalidState类都继承自State类,并实现了handleInput()方法。在ValidState中,如果输入的长度小于5,则将状态设置为InvalidState,否则将表单值设置为输入内容。在InvalidState中,如果输入的长度大于等于5,则将状态设置为ValidState

最后,通过创建一个FormContext实例,并调用handleInput()方法来测试代码。

2. UI 组件状态

在处理 UI 组件的不同状态时,状态模式可以帮助我们根据不同的状态来改变组件的行为和样式。

 
// 定义状态接口
class State {render(context) {throw new Error("render() method must be implemented");}
}
// 定义具体状态类
class LoadingState extends State {render(context) {console.log("Rendering loading state");// 渲染加载中的 UI 组件}
}
class ErrorState extends State {render(context) {console.log("Rendering error state");// 渲染错误的 UI 组件}
}
class SuccessState extends State {render(context) {console.log("Rendering success state");// 渲染成功的 UI 组件}
}
// 定义上下文类
class UIContext {constructor() {this.state = new LoadingState();}setState(state) {this.state = state;}render() {this.state.render(this);}
}
// 使用示例
const uiContext = new UIContext();
uiContext.render(); // 输出: "Rendering loading state"
uiContext.setState(new ErrorState());
uiContext.render(); // 输出: "Rendering error state"

这段代码定义了一个状态类(State)和三个具体状态类(LoadingStateErrorStateSuccessState),每个具体状态类都实现了 render() 方法。同时,还定义了一个上下文类(UIContext),它包含了当前状态(state)和三个方法:setState() 用于改变当前状态,render() 用于渲染当前状态。

在示例中,首先创建了一个 UIContext 实例,并调用 render() 方法,此时输出 "Rendering loading state",说明初始状态下渲染的是加载状态。接着,通过 setState() 方法将当前状态设置为 ErrorState,再调用 render() 方法,此时输出 "Rendering error state",说明现在渲染的是错误状态。

优点和缺点

优点
  1. 状态模式将对象行为和属性与特定条件下的处理逻辑分离开来,提高了代码的可维护性和可扩展性。
  2. 可以轻松地添加新的状态类,而无需修改现有代码。
  3. 状态模式使得状态转换更加清晰和可控,易于理解和调试。
缺点
  1. 当状态较多或状态转换复杂时,可能会导致类的数量增加,增加了代码的复杂性。
  2. 如果状态之间有共享数据,可能需要额外的管理和同步机制。

总结

状态模式是一种非常有用的设计模式,在前端开发中经常用于管理应用状态和处理复杂的流程。它通过将对象行为和属性与特定条件下的处理逻辑分离开来,提高了代码的可维护性和可扩展性。通过使用状态模式,我们可以优雅地管理应用状态,并根据不同的条件来改变对象行为。然而,在应用状态模式时需要权衡其带来的优缺点,并根据具体情况进行选择。

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

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

相关文章

【面试经典150 | 栈】有效的括号

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;栈哈希表 其他语言cpython3 写在最后 Tag 【栈】 题目来源 20. 有效的括号 题目解读 括号有三种类型&#xff0c;分别是小括号、中括号和大括号&#xff0c;每种括号的左右两半括号必须一一对应才是有效的括号&#…

JetBrains系列IDE全家桶激活

jetbrains全家桶 正版授权&#xff0c;这里有账号授权的渠道&#xff1a; https://www.mano100.cn/thread-1942-1-1.html 附加授权后的一张图片

Spark---数据输出

1. 输出为Python对象 collect算子&#xff1a;将RDD各个分区内的数据&#xff0c;统一收集到Driver中&#xff0c;形成一个List对象 reduce算子&#xff1a;对RDD数据集按照传入的逻辑进行聚合 take算子&#xff1a;取RDD的前N个元素&#xff0c;组合成list返回给你 count…

HCIA -- 动态路由协议之RIP

一、静态协议的优缺点&#xff1a; 缺点&#xff1a; 1、中大型网络配置量过大 2、不能基于拓扑的变化而实时的变化 优点&#xff1a; 1、不会额外暂用物理资源 2、安全问题 3、计算路径问题 简单、小型网络建议使用静态路由&#xff1b;中大型较复杂网络&#xff0c;建议使用…

【MySQL】8.0新特性、窗口函数和公用表表达式

文章目录 1. 新增特性2. 移除旧特性2.1 优点2.2 缺点 3. 新特性1&#xff1a;窗口函数3.1 使用窗口函数前后对比3.2 窗口函数分类3.3 语法结构3.4 分类讲解3.4.1 序号函数3.4.1.1 ROW_NUMBER()函数3.4.1.2 RANK()函数3.4.1.3 DENSE_RANK()函数 3.4.2 分布函数3.4.2.1 PERCENT_R…

javaEE -3(12000字详解多线程)

一&#xff1a;单例模式 首先啥是设计模式? 设计模式好比象棋中的 “棋谱”. 红方当头炮, 黑方马来跳. 针对红方的一些走法, 黑方应招的时候有一些固定的套路. 按照套路来走局势就不会吃亏. 软件开发中也有很多常见的 “问题场景”. 针对这些问题场景, 大佬们总结出了一些固…

力扣100114. 元素和最小的山形三元组 II(中等)

题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a; i < j < knums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的山形三元组…

【RNA structures】RNA-seq 分析: RNA转录的重构和前沿测序技术

文章目录 RNA转录重建1 先简单介绍一下测序相关技术2 Map to Genome Methods2.1 Step1 Mapping reads to the genome2.2 Step2 Deal with spliced reads2.3 Step 3 Resolve individual transcripts and their expression levels 3 Align-de-novo approaches3.1 Step 1: Generat…

Vue2基础知识(一) 认识Vue

&#x1f48c; 所属专栏&#xff1a;【Vue2】&#x1f600; 作 者&#xff1a;长安不及十里&#x1f4bb;工作&#xff1a;目前从事电力行业开发&#x1f308;目标&#xff1a;全栈开发&#x1f680; 个人简介&#xff1a;一个正在努力学技术的Java工程师&#xff0c;专注基础和…

【JavaEE初阶】 线程池详解与实现

文章目录 &#x1f334;线程池的概念&#x1f384;标准库中的线程池&#x1f340;ThreadPoolExecutor 类&#x1f6a9;corePoolSize与maximumPoolSize&#x1f6a9;keepAliveTime&#x1f6a9;ThreadFactory&#x1f6a9;workQueue&#x1f6a9;RejectedExecutionHandler handl…

【PB续命02】Oracle中加密及编码等

Oracle中实现Md5/Base64/AesBase64/UrlEncode等加密编码的使用备忘&#xff0c;参考其它人的贴子&#xff0c;Oracle 11g 亲测有效。 1. Oracle中实现Md5加密 SELECT lower(MD5(白龙马5217)) FROM dual; --返回结果 72853926982028ab8219921ad2918b8f --或 select utl_raw.…

PDF编辑阅读 PDF Expert v3.5.2

PDF Expert是由Readdle开发的一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 以下是PDF Expert的特点&#xff1a; PDF编辑&#xff1a;PDF Expert提供了丰富的PDF编辑功能&#xff0c;包括添加、删除、移动…

【safetensor】Debug

更多信息详见我的另一篇文档: 介绍 加载权重错误 从本地加载 stable-diffusion 时&#xff0c; model_id D:\code\git_diffusion_repo\sd\stable-diffusion-v1-5 pipe StableDiffusionPipeline.from_pretrained(model_id, torch_dtypetorch.float16, revision"fp16&…

SQL基础语法总结(查询)

学习网站&#xff1a;https://www.w3schools.com/sql/&#xff0c;提供在线编程 以下内容仅SQL常见语法总结 数据 Customers表 Products表 OrderDetails表 Orders表 Shippers表 Employees表 选择查询 SELECT select语句用来从头数据库中选择数据 SELECT column1, column2,…

【论文阅读笔记】 Curated Pacific Northwest AI-ready Seismic Dataset

Curated Pacific Northwest AI-ready Seismic Dataset 太平洋西北部人工智能地震数据集 摘要 描述了一个AI就绪地震数据集包括各种地震事件参数 仪器元数据 地震波行描述地震目录和事件属性&#xff08;事件震级类型&#xff0c;信道类型&#xff0c;波形极性&#xff0c;信…

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain----《BadNets:识别机器学习模型供应链中的漏洞》 背景&#xff1a; 许多用户将训练过程外包给云计算&#xff0c;或者依赖于经过训练的模型&#xff0c;然后根据特定的任务对模型进行微调。这…

SequenceFile、元数据操作与MapReduce单词计数

文章目录 SequenceFile、元数据操作与MapReduce单词计数一、实验目标二、实验要求三、实验内容四、实验步骤附&#xff1a;系列文章 SequenceFile、元数据操作与MapReduce单词计数 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS SequenceFile读写操作掌握Map…

Linux下Jenkins自动化部署SpringBoot应用

Linux下Jenkins自动化部署SpringBoot应用 1、 Jenkins介绍 官方网址&#xff1a;https://www.jenkins.io/ 2、安装Jenkins 2.1 centos下命令行安装 访问官方&#xff0c;点击文档&#xff1a; 点击 Installing Jenkins&#xff1a; 点击 Linux&#xff1a; 选择 Red Hat/…

文件系统相关

文件系统部分的大纲要求&#xff1a; 文件系统的全局结构&#xff1a;文件系统在外存中的结构&#xff0c;文件系统在内存中的结构外存空闲空间管理办法虚拟文件系统文件系统挂载 一、文件系统的层次结构 可分为三个层次&#xff1a;最低层是对象及其属性&#xff0c;中间层…

力扣:盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 …