当前位置: 首页 > 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 设计模式之【策略模式】

相关文章:

  • 生信分析Python编程高级技巧
  • DAY16||513.找树左下角的值 |路径总和|从中序与后序遍历序列构造二叉树
  • llama_deploy
  • 5个最佳开源RPA框架之一UI.Vision介绍
  • SylixOS网络之DMA(Direct Memory Access)
  • docker 创建showdoc服务 showdoc容器部署教程
  • 计算机毕业设计 在线问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 【文心智能体】 旅游手绘手帐 开发分享 零代码 手绘风景 记录行程和心情 旅游攻略
  • 基于真实山地场景下的超多目标优化算法求解无人机三维路径规划,MATLAB代码
  • 短剧向左,体育向右,快手前途未卜?
  • 基于STM32的智能家居交互终端:使用FreeRTOS与MQTT协议的流程设计
  • MyBatis 中的类型别名配置详解
  • EasyExcel将数据库里面的数据生成excel文件
  • Java 之注解详解
  • VLM系列文章7-Molmo and PixMo
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • export和import的用法总结
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • PaddlePaddle-GitHub的正确打开姿势
  • SQLServer之创建显式事务
  • web标准化(下)
  • 电商搜索引擎的架构设计和性能优化
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 深入浅出Node.js
  • 一些关于Rust在2019年的思考
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 第二十章:异步和文件I/O.(二十三)
  • 数据库巡检项
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #stm32驱动外设模块总结w5500模块
  • $.each()与$(selector).each()
  • ()、[]、{}、(())、[[]]命令替换
  • (04)odoo视图操作
  • (35)远程识别(又称无人机识别)(二)
  • (day18) leetcode 204.计数质数
  • (补充)IDEA项目结构
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (函数)颠倒字符串顺序(C语言)
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)Dubbo快速入门、介绍、使用
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .gitignore文件忽略的内容不生效问题解决
  • .htaccess配置常用技巧
  • .Net Remoting常用部署结构
  • .net 获取url的方法
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .Net插件开发开源框架
  • .Net中间语言BeforeFieldInit