前端开发设计模式——状态模式
目录
一、状态模式的定义和特点
二、状态模式的结构与原理
1.结构:
2.原理:
三、状态模式的实现方式
四、状态模式的使用场景
1.按钮的不同状态:
2.页面加载状态:
3.用户登录状态:
五、状态模式的优点
1.提高代码的可维护性:
2.增强代码的可读性:
3.更好的处理动态变化:
六、状态模式的缺点
1.增加了代码的复杂性:
2.可能会增加内存占用:
七、状态模式的注意事项
1.状态的划分要合理:
2.状态的转换要清晰:
3.注意性能问题:
一、状态模式的定义和特点
定义:状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
特点:
将状态的行为封装在独立的状态类中,使得状态的转换更加清晰、可维护。
减少了条件判断语句,使代码更加简洁、易于理解。
实现了状态与行为的解耦,使得状态的变化不会影响到对象的其他部分。
二、状态模式的结构与原理
1.结构:
1.1 状态接口:
定义了一组方法,这些方法代表了对象在不同状态下的行为。
1.2 具体状态类:
实现状态接口,每个具体状态类代表对象的一种特定状态,并实现与该状态相关的行为。
1.3 上下文对象:
拥有一个对当前状态的引用,并将与状态相关的操作委托给当前状态对象。当上下文对象的内部状态发生变化时,它会切换到不同的具体状态类,从而改变其行为。
2.原理:
通过将对象的行为与状态分离,使得对象可以在不同的状态下表现出不同的行为。当对象的状态发生变化时,它会自动切换到相应的状态类,执行该状态下的行为。
三、状态模式的实现方式
步骤:
1.定义状态接口,明确在不同状态下需要实现的方法。
示例:
class State {handleEvent() {throw new Error('This method must be overridden.');}
}
2.创建具体状态类,实现状态接口,并在每个类中实现特定状态下的行为。
示例:
class StateA extends State {handleEvent() {console.log('In State A.');// 执行状态 A 下的特定行为}
}class StateB extends State {handleEvent() {console.log('In State B.');// 执行状态 B 下的特定行为}
}
3.在上下文对象中,维护一个对当前状态的引用,并提供方法来设置和切换状态。上下文对象将与状态相关的操作委托给当前状态对象执行。
示例:
class Context {constructor() {this.state = new StateA();}setState(state) {this.state = state;}handleEvent() {this.state.handleEvent();}
}
四、状态模式的使用场景
1.按钮的不同状态:
例如按钮有正常状态、禁用状态、鼠标悬停状态等,每个状态下的行为不同,可以使用状态模式来管理这些状态和行为。
2.页面加载状态:
页面在加载数据时可能处于不同的状态,如正在加载、加载成功、加载失败等,可以使用状态模式来处理不同状态下的显示和交互。
示例:
假设我们正在开发一个新闻资讯类的网页应用。当用户打开页面时,页面需要从服务器获取新闻数据并展示给用户。在这个过程中,页面会经历不同的状态:
(1)正在加载状态:页面刚打开时,显示一个加载动画,告知用户数据正在加载中。此时可以创建一个 “加载中” 的状态类,比如:
class LoadingState {show() {document.getElementById('content').innerHTML = '<div class="loader">Loading...</div>';}
}
(2)加载成功状态:当数据成功从服务器返回并渲染到页面上时,显示新闻列表。创建一个 “加载成功” 的状态类
class SuccessState {show(data) {let html = '';data.forEach(item => {html += `<div>${item.title}</div>`;});document.getElementById('content').innerHTML = html;}
}
(3)加载失败状态:如果数据加载过程中出现错误,显示错误提示信息。对应的状态类如下:
class ErrorState {show() {document.getElementById('content').innerHTML = '<div class="error">Failed to load data.</div>';}
}
然后创建一个上下文对象来管理这些状态:
class PageStateContext {constructor() {this.state = new LoadingState();}setState(state) {this.state = state;}show() {this.state.show();}
}
在实际使用中,可以根据不同的情况切换状态:
const context = new PageStateContext();
// 模拟数据加载
setTimeout(() => {const isSuccess = Math.random() > 0.5;if (isSuccess) {const data = [{ title: 'News 1' },{ title: 'News 2' }];context.setState(new SuccessState());context.show(data);} else {context.setState(new ErrorState());context.show();}
}, 2000);
3.用户登录状态:
用户在未登录、登录中、已登录等状态下,页面的显示和功能会有所不同,可以使用状态模式来管理这些状态。
示例:
在一个社交类的前端应用中,用户的登录状态会影响页面的显示和功能。可以使用状态模式来管理用户的登录状态:
(1)未登录状态:显示登录按钮和注册链接。状态类如下:
class NotLoggedInState {show() {document.getElementById('userArea').innerHTML = '<button>Login</button><a href="#">Register</a>';}
}
(2) 登录中状态:显示加载动画,提示用户正在登录。状态类为:
class LoggingInState {show() {document.getElementById('userArea').innerHTML = '<div class="loader">Logging in...</div>';}
}
(3) 已登录状态:显示用户头像和用户名,以及退出登录按钮。状态类如下:
class LoggedInState {show(user) {document.getElementById('userArea').innerHTML = `<img src="${user.avatar}" alt="Avatar"><span>${user.username}</span><button>Logout</button>`;}
}
创建上下文对象来管理这些状态:
class UserStateContext {constructor() {this.state = new NotLoggedInState();}setState(state) {this.state = state;}show() {this.state.show();}
}
在实际应用中,可以根据用户的操作切换状态:
const context = new UserStateContext();
// 模拟用户点击登录按钮
document.getElementById('loginButton').addEventListener('click', () => {context.setState(new LoggingInState());context.show();// 模拟登录成功setTimeout(() => {const user = { username: 'John', avatar: 'avatar.jpg' };context.setState(new LoggedInState());context.show(user);}, 2000);
});
// 模拟用户点击退出登录按钮
document.getElementById('logoutButton').addEventListener('click', () => {context.setState(new NotLoggedInState());context.show();
});
五、状态模式的优点
1.提高代码的可维护性:
状态和行为的分离使得代码更加清晰,易于修改和扩展。
2.增强代码的可读性:
通过将状态的行为封装在独立的类中,使得代码的逻辑更加清晰,易于理解。
3.更好的处理动态变化:
可以轻松地添加新的状态和行为,适应不断变化的需求。
六、状态模式的缺点
1.增加了代码的复杂性:
引入了更多的类和对象,可能会使代码结构变得更加复杂。
2.可能会增加内存占用:
每个状态都需要一个具体的状态类实例,可能会占用更多的内存。
七、状态模式的注意事项
1.状态的划分要合理:
根据实际需求合理划分状态,避免状态过多或过少。
2.状态的转换要清晰:
确保状态之间的转换逻辑清晰,避免出现混乱的状态转换。
3.注意性能问题:
如果状态的切换非常频繁,可能会影响性能,可以考虑优化状态的管理方式。
关于状态模式的介绍就到此结束,如果对于其他设计模式感兴趣的话,可以看看下方的专栏目录,里面有其他设计模式的文章。码字不易,点个赞再走吧

相关文章:
前端开发设计模式——状态模式
目录 一、状态模式的定义和特点 二、状态模式的结构与原理 1.结构: 2.原理: 三、状态模式的实现方式 四、状态模式的使用场景 1.按钮的不同状态: 2.页面加载状态: 3.用户登录状态: 五、状态模式的优点 1.提…...
特种作业操作烟花爆竹试题分享
1.(单选题)职业卫生研究的是人类从事各种职业劳动过程中的( )。 A.健康问题 B.环境问题 C.卫生问题 答案:C 2.(单选题)安全生产事关人民群众的( )安全,事关改革发展和…...
实现prometheus+grafana的监控部署
直接贴部署用的文件信息了 kubectl label node xxx monitoringtrue 创建命名空间 kubectl create ns monitoring 部署operator kubectl apply -f operator-rbac.yml kubectl apply -f operator-dp.yml kubectl apply -f operator-crd.yml # 定义node-export kubectl app…...
确保Spring Boot定时任务只执行一次方案
在Spring Boot项目中,确保定时任务只执行一次是一个常见的需求。这种需求可以通过多种方式来实现,以下是一些常见的方法,它们各具特点,可以根据项目的实际需求来选择最合适的方法。 1. 使用Scheduled注解并设置极大延迟 一种简单…...
【Python数据可视化】利用Matplotlib绘制美丽图表!
【Python数据可视化】利用Matplotlib绘制美丽图表! 数据可视化是数据分析过程中的重要步骤,它能直观地展示数据的趋势、分布和相关性,帮助我们做出明智的决策。在 Python 中,Matplotlib 是最常用的可视化库之一,它功能…...
【最新通知】2024年Cisco思科认证CCNA详解
CCNA现在涵盖安全性、自动化和可编程性。该计划拥有一项涵盖IT职业基础知识的认证,包括一门考试和一门培训课程,助您做好准备。 CCNA培训课程和考试最近面向最新技术和工作岗位进行了重新调整,为您提供了向任何方向发展事业所需的基础。CCNA认…...
监控内容、监控指标、监控工具大科普
在现代信息技术领域,监控技术扮演着至关重要的角色。它帮助我们实时了解系统、网络、应用以及环境的状态,确保它们的安全、稳定和高效运行。以下是对监控内容、监控指标和监控工具的详细科普。 一、监控内容 监控内容是指监控系统所关注和记录的具体信…...
生成文件夹 - python 实现
生成文件夹保存图片和文本等信息。 代码具体实现如下: #-*-coding:utf-8-*- # date:2021-04-13 # Author: DataBall - XIAN # Function: 生成文件夹import os if __name__ "__main__":path "./dataset"if not os.path.exists(path): # 如果…...
快速了解学会python基础语言及IDLE 提供的常用快捷键
😀前言 本篇博文是关于python的基础语言介绍及IDLE 提供的常用快捷键,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的…...
【python】OpenCV—Sort the Point Set from Top Left to Bottom Right
文章目录 1、功能描述2、代码实现3、效果展示4、更多例子5、参考 1、功能描述 给出一张图片,里面含有各种图形,取各种图形的中心点,从左到右从上到下排序 例如 2、代码实现 import cv2 import numpy as npdef process_img(img):img_gray c…...
LeetCode 1493.删掉一个元素以后全为1的最长子数组
题目: 给你一个二进制数组 nums ,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。 思路:不定长滑动窗口,将问题…...
php常用设计模式之工厂模式
引言 在日常开发中,我们一些业务场景需要用到发送短信通知。然而实际情况考虑到不同厂商之间的价格、实效性、可能会出现的情况等 我们的业务场景往往会接入多个短信厂商来保证我们业务的正常运行,而不同的短信厂商(如阿里云短信、腾讯云短信…...
通用软件版本标识
软件版本标识:了解不同的版本类型 在软件开发和发布过程中,版本号和标识扮演着重要的角色。它们不仅帮助开发者追踪软件的演变,还让用户了解软件的稳定性和功能。以下是一些常见的软件版本标识,以及它们的含义和用途。 Alpha&am…...
(计算机毕设)基于SpringBoot的就业平台开题报告
一、立题依据(国内外研究进展或选题背景、研究意义等) 国内外研究进展或选题背景 在全球化的大背景下,就业问题一直是各国政府和社会各界关注的焦点。随着互联网技术的普及和发展,网络招聘已成为求职者和企业招聘的主要渠道。据相关数据显示࿰…...
STM32G4系列MCU的ADC模块标定方法和采样时间
目录 概述 1 ADC模块标定 1.1 功能介绍 1.2 软件程序校准ADC 1.2.1 标定步骤 1.2.2 标定时序框图 1.3 软件程序重新注入校准因子到ADC 1.3.1 标定步骤 1.3.2 更新ADC校准因子 1.4 用单个ADC转换单端和差分模拟输入 1.4.1 标定流程 1.4.2 混合单端和差分通道 2 通道…...
NVIDIA Jetson支持的神经网络加速的量化平台
NVIDIA Jetson支持的神经网络加速的量化工具、技术 NVIDIA Jetson 是专为边缘计算和嵌入式系统设计的高性能计算平台,它支持多种深度学习模型的部署和推理。对于神经网络加速的量化平台,Jetson 支持以下技术和工具: TensorRT:Ten…...
MySQL 免密登录的几种配置方式
文章目录 MySQL 免密登录的几种配置方式使用操作系统用户实现免密登录具体步骤:Step 1: 修改 MySQL 配置文件Step 2: 重启 MySQL 服务Step 3: 使用系统用户登录 MySQL优点:缺点: 使用 mysql_config_editor 配置免密文件具体步骤:S…...
html全局属性、框架标签
常用的全局属性: 属性名含义id 给标签指定唯一标识,注意:id是不能重复的。 作用:可以让label标签与表单控件相关联;也可以与css、JavaScript配合使用。 注意:不能再以下HTML元素中使用:<hea…...
ARL 灯塔 | CentOS7 — ARL 灯塔搭建流程(Docker)
关注这个工具的其它相关内容:自动化信息收集工具 —— ARL 灯塔使用手册 - CSDN 博客 灯塔,全称:ARL 资产侦察灯塔系统,有着域名资产发现和整理、IP/IP 段资产整理、端口扫描和服务识别、WEB 站点指纹识别、资产分组管理和搜索等等…...
抖音列表页采集-前言
准备工作: 1.关于selenium介绍: python自动化入门的话,selenium绝对是最方便的选择,基本逻辑即为:程序模拟人的行为操作浏览器,这样的操作需要借用浏览器驱动,我选用的是chrome浏览器ÿ…...
GitLab Runner配置总出错?手把手教你调试config.toml文件
GitLab Runner配置总出错?手把手教你调试config.toml文件 当你第一次打开GitLab Runner的config.toml文件时,可能会被里面密密麻麻的参数搞得一头雾水。这个看似简单的配置文件,实际上藏着许多让中高级用户都容易踩坑的细节。今天我们就来彻底…...
2025平航杯电子取证实战:从木马溯源到服务器渗透的完整链条分析
1. 木马溯源:从可疑流量到攻击者定位 2025年4月,杭州滨江警方接到一起特殊报案。市民刘晓倩(化名倩倩)发现自己的手机出现异常发热、电量消耗过快等现象,怀疑设备被人监控。这个看似普通的个人隐私案件,最终…...
如何用PlugY实现暗黑破坏神2单机体验增强
如何用PlugY实现暗黑破坏神2单机体验增强 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 在暗黑破坏神2的单机冒险中,玩家常常面临储物空间不足、角色加点…...
开关电源拓扑结构解析:从反激到正激的实战应用
1. 开关电源拓扑结构入门指南 第一次接触开关电源设计时,我被各种拓扑结构搞得晕头转向。直到有次把电源板烧冒烟了才明白,选错拓扑就像用菜刀砍柴——不是不能用,但效率低还危险。开关电源拓扑结构决定了电能转换的基本框架,就像…...
Qwen3-VL-30B效果实测:识别复杂图表毫无压力,回答精准又详细
Qwen3-VL-30B效果实测:识别复杂图表毫无压力,回答精准又详细 1. 开篇:当AI真正"看懂"了世界 想象一下这样的场景:你随手拍下一张满是数据和曲线的科研论文图表,AI不仅能准确识别出每个坐标轴的含义&#x…...
GLM-4.1V-9B-Base入门必看:中文提问技巧——如何写出高稳定度问题
GLM-4.1V-9B-Base入门必看:中文提问技巧——如何写出高稳定度问题 1. 认识GLM-4.1V-9B-Base GLM-4.1V-9B-Base是智谱开源的视觉多模态理解模型,专门用于处理图像内容识别、场景描述、目标问答等中文视觉理解任务。与普通聊天模型不同,它更擅…...
Pixel Language Portal实操手册:自定义天空蓝主题(#e3f2fd)与金币黄按钮配置
Pixel Language Portal实操手册:自定义天空蓝主题(#e3f2fd)与金币黄按钮配置 1. 工具概览 **像素语言跨维传送门(Pixel Language Portal)**是一款基于腾讯Hunyuan-MT-7B核心引擎构建的创新翻译工具。与传统翻译软件不同,它将语言转换过程设计成一场16-…...
intv_ai_mk11惊艳效果:输入‘用小学生能懂的话解释Transformer’→输出比喻+图示描述+小练习
intv_ai_mk11惊艳效果:输入用小学生能懂的话解释Transformer→输出比喻图示描述小练习 1. 效果展示开场 当我第一次尝试让intv_ai_mk11解释Transformer这个复杂概念时,我完全没想到它会给出如此惊艳的答案。我输入了一个看似简单的请求:&qu…...
告别GitHub下载卡顿:手把手教你配置Electron国内镜像(npmrc文件详解)
告别Electron下载困境:深度解析.npmrc配置与国内镜像实战指南 每次执行npm install electron时,看着进度条卡在node install.js阶段一动不动,或是突然蹦出RequestError: connect ETIMEDOUT的红色报错——这种体验对于国内开发者来说再熟悉不过…...
Clipboard命令行参数完整指南:掌握所有可用选项的终极手册
Clipboard命令行参数完整指南:掌握所有可用选项的终极手册 【免费下载链接】Clipboard 😎🏖️🐬 Your new, 𝙧𝙞𝙙𝙤𝙣𝙠𝙪𝙡…...
