当前位置: 首页 > news >正文

TypeScript 设计模式之【状态模式】

文章目录

  • 状态模式:优雅切换的交通信号灯
  • 状态模式的奥秘
    • 状态模式有什么利与弊?
    • 如何使用状态模式来优化你的系统
    • 代码实现案例
    • 状态模式的主要优点
    • 状态模式的主要缺点
    • 状态模式的适用场景
    • 总结

在这里插入图片描述

状态模式:优雅切换的交通信号灯

当你站在繁忙的十字路口,看着交通信号灯有规律地变换颜色。这个看似简单的信号灯系统,实际上完美诠释了状态模式的精髓。

在软件开发中,我们经常遇到对象需要在不同状态之间切换,在每个状态下表现出不同行为的情况。状态模式就像这个交通信号灯,它允许一个对象在其内部状态改变时改变它的行为,看起来就像改变了对象的类一样!

状态模式的奥秘

状态模式就像一个"行为变形金刚",它将与特定状态相关的行为局部化,并将不同状态的行为分割开来。通过这种方式,你可以独立于其他状态来添加新的状态或者修改现有状态,使得系统更加灵活和可扩展。

状态模式有什么利与弊?

状态模式的优点是它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。它消除了庞大的条件分支语句,增强了可扩展性。缺点是会增加类的数量,可能会导致状态类过多。

如何使用状态模式来优化你的系统

状态模式涉及角色

  • 上下文(Context): 定义客户感兴趣的接口,维护一个具体状态类的实例
  • 状态(State): 定义一个接口以封装与 Context 的一个特定状态相关的行为
  • 具体状态(ConcreteState): 每一个子类实现一个与 Context 的一个状态相关的行为

状态模式步骤

  1. 创建一个状态接口,定义所有具体状态的共同行为
  2. 创建具体状态类,实现状态接口,定义特定状态下的行为
  3. 创建上下文类,包含当前状态的引用和切换状态的方法
  4. 在上下文类中实现客户端接口,将行为委托给当前状态对象
  5. 客户端通过上下文类来改变状态,触发不同的行为

选择合适的状态模式,你就能轻松地管理对象在不同状态下的行为,让系统变得更加灵活和可维护!

代码实现案例

// 交通灯状态接口
interface TrafficLightState {handle(context: TrafficLight): void;
}// 具体状态类 - 红灯
class RedLight implements TrafficLightState {handle(context: TrafficLight): void {console.log("红灯亮起,车辆停止,行人通行");setTimeout(() => context.setState(new GreenLight()), 5000);}
}// 具体状态类 - 绿灯
class GreenLight implements TrafficLightState {handle(context: TrafficLight): void {console.log("绿灯亮起,车辆通行,行人等待");setTimeout(() => context.setState(new YellowLight()), 5000);}
}// 具体状态类 - 黄灯
class YellowLight implements TrafficLightState {handle(context: TrafficLight): void {console.log("黄灯亮起,车辆减速,准备停止");setTimeout(() => context.setState(new RedLight()), 2000);}
}// 上下文类 - 交通信号灯
class TrafficLight {private state: TrafficLightState;constructor() {this.state = new RedLight();}setState(state: TrafficLightState): void {this.state = state;this.state.handle(this);}start(): void {this.state.handle(this);}
}// 客户端代码
const trafficLight = new TrafficLight();
trafficLight.start();// 输出
// 红灯亮起,车辆停止,行人通行
// (5秒后)
// 绿灯亮起,车辆通行,行人等待
// (5秒后)
// 黄灯亮起,车辆减速,准备停止
// (2秒后)
// 红灯亮起,车辆停止,行人通行
// ...循环继续

在这里插入图片描述

状态模式的主要优点

  1. 封装了转换规则: 将状态的转换规则封装在状态类中,减少了 Context 类的复杂度
  2. 枚举可能的状态: 在一个地方枚举可能的状态,使得增加新的状态和转换变得容易
  3. 消除庞大的条件分支语句: 避免了使用大量的 if…else 语句
  4. 状态对象可共享: 如果状态对象没有实例变量,它们可以被多个 Context 对象共享

状态模式的主要缺点

  1. 增加类的数量: 状态模式将每个状态封装成单独的类,可能会导致类的数量增加
  2. 状态模式的结构与实现都较为复杂: 对于简单的状态判断,使用状态模式可能会显得小题大做
  3. 状态之间的转换逻辑分散: 虽然消除了条件分支语句,但是转换逻辑分散在各个状态类中,可能不容易看到整个状态机的结构

状态模式的适用场景

  1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
  2. 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态
  3. 需要频繁地改变对象的内部状态,同时又希望避免使用大量的 if-else 语句

总结

状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为。状态模式通过将状态封装成独立的类,并将请求委托给当前的状态对象,来实现对象的状态转换。这种模式增强了程序的灵活性和可扩展性,也提高了代码的可读性和可维护性。合理使用状态模式可以让你的代码结构更加清晰,更易于理解和维护。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告: TypeScript 设计模式之【策略模式】

相关文章:

TypeScript 设计模式之【状态模式】

文章目录 状态模式:优雅切换的交通信号灯状态模式的奥秘状态模式有什么利与弊?如何使用状态模式来优化你的系统代码实现案例状态模式的主要优点状态模式的主要缺点状态模式的适用场景总结 状态模式:优雅切换的交通信号灯 当你站在繁忙的十字路口&#…...

MongoDB 聚合管道

参考: 聚合管道 - MongoDB 手册 v7.0 介绍 聚合管道由一个或多个处理文档的阶段组成: 每个阶段对输入文档执行一个操作。例如,某个阶段可以过滤文档、对文档进行分组并计算值。 从一个阶段输出的文档将传递到下一阶段。 一个聚合管道可以返回针对文档…...

python-patterns:Python 设计模式大全

python-patterns 是一个开源的 Python 项目,它提供了各种经典的设计模式的 Python 实现。设计模式是一种针对常见软件设计问题的可复用解决方案,通过使用设计模式,开发者可以编写出结构更加合理、易于维护和扩展的代码。 Python 是一门动态语…...

Nginx编译所需基本库pcre、zlib、openssl

一、基本库介绍 pcre:(Perl Compatible Regular Expressions) 是一个用 C 语言编写的正则表达式库,用于进行文本匹配和搜索。它提供了与 Perl 正则表达式兼容的功能,并且广泛用于许多不同的软件项目中,如网…...

C#进阶:探索嵌套类、匿名类及对象初始化器的强大运用

在C#中,嵌套类、匿名类以及对象初始化器是几种强大的特性,它们可以极大地提高代码的可读性和灵活性。下面分别介绍这些特性的运用。 1. 嵌套类 嵌套类是指定义在另一个类内部的类。内部类可以访问其外围类的所有成员(包括私有成员&#xff…...

匈牙利算法模板

P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:最模板的一集.还未匹配则匹配&#xff0c;否则之前一个给现在这个让位置. int n,m,e; vector<int> vct[505]; int match[505]; bool vis[505]; bool mark[505][505]; bool dfs(int s)…...

ubuntu 安装harbor

#安装包 wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz.asc#导入签名公钥 gpg --keyserver hkps://ke…...

Python/大数据/机器识别毕业设计选题题目推荐

基于Python和Diango在线购物商城系统报告文档指导搭建视频 基于深度学习的人脸识别与管理系统&#xff0c;Python实现 基于Python/机器学习链家网新房数据可视化及预测系统 Python豆瓣电影情感分析推荐系统爬虫可视化&#xff0c;过滤算法 基于python的django框架生鲜商城管…...

基于Python的人工智能应用案例系列(17):LSTM正弦波预测

概述 本案例展示了如何使用LSTM&#xff08;长短期记忆网络&#xff09;来预测正弦波序列的未来值。由于正弦波具有周期性&#xff0c;传统的神经网络难以准确预测其上升或下降趋势&#xff0c;而LSTM则能够通过学习值的模式来进行更精准的预测。本案例将训练LSTM模型并预测正弦…...

Python空间地表联动贝叶斯地震风险计算模型

&#x1f3af;要点 使用贝叶斯推断模型兼顾路径和场地效应&#xff0c;量化传统地理统计曲线拟合技术。使用破裂和场地特征等地质信息以及事件间残差和事件内残差描述数学模型模型使用欧几里得距离度量、角距离度量和土壤差异性度量确定贝叶斯先验分布和后验分布参数&#xff…...

虚幻引擎-设置UI自适应屏幕大小

在游戏中&#xff0c;如果想实现不同分辨率下&#xff0c;都可以支持当前的UI界面布局&#xff0c;都需要用到锚点功能。 ‌虚幻引擎中的UI锚点&#xff08;Anchor&#xff09;是指控件在屏幕或父物体上的固定点&#xff0c;用于确定控件的位置和布局。‌ 锚点的作用是确保UI元…...

C++继承的三种方式[ACCESS]

C继承的定义 两个类的继承关系在派生类中声明&#xff0c;派生类定义使用以下语法&#xff1a; class DerivedClass: [ACCESS] BaseClass{ /…/ }; 冒号&#xff08;:&#xff09;后的[ACCESS]是继承的最高权限级别符&#xff0c;可以是以下三个值&#xff08;存取权限级别&am…...

idea 同一个项目不同模块如何设置不同的jdk版本

在IntelliJ IDEA中&#xff0c;可以为同一个项目中的不同模块设置不同的JDK版本。这样做可以让你在同一个项目中同时使用多个Java版本&#xff0c;这对于需要兼容多个Java版本的开发非常有用。以下是设置步骤&#xff1a; 打开项目设置&#xff1a; 在IDEA中&#xff0c;打开你…...

1-仙灵之谜(区块链游戏详情介绍)

1-仙灵之谜&#xff08;区块链游戏详情介绍&#xff09; 前言&#xff08;该游戏仅供娱乐&#xff09;正文 前言&#xff08;该游戏仅供娱乐&#xff09; 依稀记得本科那会儿参加了一个区块链实验室&#xff0c;那时每周末大家都会爬山或者抽出一下午讨论区块链以及未来&#x…...

基于51单片机的温湿度上下限监测预警proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1hSprWBYhKKx8Txzaj33YPA?pwdjp3d 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMic…...

考核总结.

事件循环 单线程的js在处理异步事件时进行的一种循环过程。 在 JS中任务分为同步与异步任务&#xff0c;其中异步任务又分为两种&#xff1a;宏任务和 微任务。宏任务和微任务的执行顺序&#xff1a;总方针是先同步再异步&#xff0c;异步中先微任务&#xff0c;在宏任务。一次…...

后端学习路线

后端学习路线 一、编程语言 至少需要学习一门编程语言&#xff0c;建议学习JAVA和GO语言。 二、数据库 数据库分为关系型数据库和非关系型数据库&#xff0c;区别在于分关系型数据库常用于大数据&#xff0c;而非关系型数据库一般不在大数据方面使用。 关系型数据库&#x…...

车辆重识别(注意力 U-Net:学习在哪些区域寻找胰腺)论文阅读2024/10/01

什么是注意力机制&#xff1f; 什么是加性注意力&#xff1f; 大致说一下流程&#xff1a; 对于一张特征图来说&#xff0c;对于这张图中的每一个像素向量&#xff08;例如a&#xff09;&#xff0c;计算该向量与所有像素向量的相似度&#xff0c;对这些相似度进行激活函数…...

【区别】git restore --staged <文件> 和 git reset HEAD <文件> 都可以用于取消已暂存的文件

git restore --staged <文件> 和 git reset HEAD <文件> 都可以用于取消已暂存的文件&#xff0c;但它们的工作原理和适用场景有所不同。以下是对这两个命令的详细比较&#xff1a; 1. 命令概述 git restore --staged <文件>&#xff1a; 专门用于将指定文件…...

void类型

编程语言中的void类型是一种特殊的数据类型&#xff0c;它表示不存在任何值。void, 无或者空类型。大部分编程语言支持void, 用做函数无返回值类型。最早ALGOL 68引入void类型。 void的特别使用 经典C缺乏void类型&#xff0c;函数可以不指定返回值&#xff0c;默认是整型int.…...

三引脚压电陶瓷片:从自激振荡原理到高效驱动电路设计

1. 三引脚压电陶瓷片为何成为硬件工程师的新宠 第一次接触三引脚压电陶瓷片时&#xff0c;我和大多数工程师一样充满疑惑&#xff1a;为什么要在传统两引脚结构上增加第三个引脚&#xff1f;直到在某个低功耗项目中&#xff0c;传统它激式蜂鸣器耗电量超出预期&#xff0c;我才…...

S905M芯片盒子救砖实战:8189ETV无线与NAND存储的线刷固件修复指南

1. 救砖前的准备工作 当你发现手里的辽宁移动数码视讯Q5盒子突然变砖&#xff0c;先别急着扔。这种采用S905M芯片的盒子其实有很高的可玩性&#xff0c;尤其是搭配8189ETV无线模块和NAND存储的方案&#xff0c;只要掌握正确方法&#xff0c;救砖成功率很高。我前前后后折腾过二…...

如何快速解密QMC音频文件:qmc-decoder完整使用指南

如何快速解密QMC音频文件&#xff1a;qmc-decoder完整使用指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否遇到过从音乐平台下载的歌曲无法在其他播放器播放的情…...

从零构建Simscape自定义物理模块:核心语法与实战指南

1. 为什么需要自定义Simscape模块&#xff1f; 在工程仿真领域&#xff0c;Simscape作为MATLAB/Simulink生态系统中的物理建模利器&#xff0c;已经内置了大量基础模块。但真实工程问题往往需要处理特殊结构——比如非标齿轮箱的振动分析、微型热管的热传导模拟&#xff0c;或是…...

别再只懂PCA了!用Python手写LDA,从鸢尾花分类实战看监督降维的威力

别再只懂PCA了&#xff01;用Python手写LDA&#xff0c;从鸢尾花分类实战看监督降维的威力 鸢尾花数据集在机器学习领域就像"Hello World"之于编程——经典、简洁却蕴含丰富可能性。当大多数人用PCA处理这类数据时&#xff0c;我们往往忽略了数据本身携带的宝贵标签信…...

GitHub 被分号击穿信任防线,AI 逆向工具敲响闭源系统安全警钟

GitHub 被分号击穿三层信任&#xff0c;AI 填平逆向护城河敲响闭源系统安全警钟 2026 年 3 月 4 日&#xff0c;GitHub 收到 Wiz 通过 Bug Bounty 提交的报告&#xff0c;报告描述的攻击入口极其简单&#xff1a;一条构造过的 git push&#xff0c;带一个 push option&#xff…...

为什么92%的AI团队Serverless化失败?奇点大会披露的4个反直觉架构断点与实时熔断方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生Serverless实践&#xff1a;2026奇点智能技术大会无服务器架构 在2026奇点智能技术大会上&#xff0c;AI原生Serverless成为核心范式——它不再将模型推理简单托管于函数即服务&#xff08;FaaS&…...

2026点评餐饮数据

数据名称&#xff1a;大众点评美食&#xff08;餐饮&#xff09;数据、美团商家全量数据、大众平台综合数据 数据时间&#xff1a;2026年最新爬虫数据&#xff0c;美食商家全品类商家全覆盖&#xff0c;同步平台最新信息&#xff0c;不拿旧数据充数 数据分类&#xff1a;上百个…...

别再死记硬背公式了!用‘能量流动’视角图解RLC二阶电路,轻松理解零输入响应

能量流动视角&#xff1a;用物理直觉破解RLC二阶电路零输入响应之谜 想象一下&#xff0c;你手中握着一个透明的能量沙漏。上层的沙子&#xff08;电能&#xff09;缓缓流入下层&#xff08;磁能&#xff09;&#xff0c;又因为重力作用回弹&#xff0c;形成有节奏的流动——这…...

STM32F4 SPI DMA实战:用CubeMX和HAL库5分钟搞定高速数据传输(附避坑指南)

STM32F4 SPI DMA实战&#xff1a;CubeMXHAL库5分钟极速配置指南 在嵌入式开发中&#xff0c;SPIDMA的组合堪称数据传输的"黄金搭档"——既能享受SPI接口的高速特性&#xff0c;又能通过DMA解放CPU资源。但传统基于寄存器的手动配置方式&#xff0c;往往让开发者陷入繁…...