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

状态设计模式是什么?什么是 State 状态设计模式?Python 状态设计模式示例代码

什么是 State 状态设计模式?

状态设计模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变其行为,使其看起来好像改变了其类。状态模式主要解决的问题是:当一个对象的行为取决于它的状态,并且在运行时可能需要根据状态改变其行为。
在这里插入图片描述

主要思想:

状态模式允许对象在内部状态改变时改变它的行为。它将对象的状态封装成独立的类,使得对象在不同的状态下有不同的行为,而且能够在运行时切换状态,但不改变其代码结构。

主要角色:

  1. Context(环境): 定义客户感兴趣的接口,并且维护一个具体状态子类的实例,以定义当前的状态。
  2. State(状态): 定义一个接口,用于封装 Context 对象的特定状态相关的行为。
  3. ConcreteState(具体状态): 每个具体状态子类都实现了 State 接口,并且定义了该状态下的行为。

在这里插入图片描述

工作流程:

  1. 定义一个 Context 类,其中包含一个 State 类型的对象引用,表示当前的状态。
  2. 定义一个 State 接口,包含了可能在不同状态下的操作方法。
  3. 对于每个具体状态,创建一个具体的状态类,实现 State 接口,并在 Context 类中维护这些状态对象。

优点:

  1. 清晰的状态管理: 状态设计模式使得状态和状态之间的转换变得清晰可见。每个状态都被封装成独立的类,便于管理和维护。

  2. 遵循开放-封闭原则: 可以在不改变原有代码的情况下,动态地添加新的状态,遵循了开放-封闭原则,使系统更易于扩展。

  3. 消除条件语句: 使用状态模式可以避免大量的条件语句,将对象的行为与其状态解耦,使得代码更简洁、清晰。

  4. 简化代码结构: 状态模式可以使得每个状态都是一个独立的类,简化了对象的代码结构,降低了代码的复杂度。

缺点:

  1. 类的数量增加: 对于有限状态机,可能会产生大量的状态类,增加了类的数量,使得系统变得复杂。

  2. 状态转换逻辑复杂: 如果状态之间的转换逻辑非常复杂,可能会导致状态模式的实现也变得复杂,需要谨慎设计。

  3. 不适用于所有情况: 状态模式并不适用于所有场景,特别是当状态之间的转换逻辑比较简单时,可能会显得过于繁琐。

  4. 可能影响性能: 对象在不同状态下的行为可能会受到状态切换的影响,有时可能会增加额外的开销,影响性能。

总的来说,状态设计模式在管理对象状态和行为上提供了一种清晰的方式,但需要在适当的场景中使用,同时考虑到状态之间的复杂性、数量和性能等方面。


Python 实现状态设计模式示例代码(一):

# Context 环境类
class Context:def __init__(self, state):self._state = statedef request(self):self._state.handle()def change_state(self, state):self._state = state# State 状态接口
class State:def handle(self):pass# ConcreteState 具体状态类
class ConcreteStateA(State):def handle(self):print("Handling in State A")class ConcreteStateB(State):def handle(self):print("Handling in State B")# 使用示例
context = Context(ConcreteStateA())
context.request()  # 输出:Handling in State A
context.change_state(ConcreteStateB())
context.request()  # 输出:Handling in State B

在这个示例中,Context 是环境类,维护一个状态对象的引用。State 是状态接口,ConcreteStateAConcreteStateB 是具体状态类,分别表示不同的状态。通过状态模式,可以使得对象在不同状态下表现出不同的行为。


Python 实现状态设计模式示例代码(二):

当你想要管理用户的登录状态时,状态设计模式可以提供一个良好的示例。在这个示例中,用户可能处于已登录或未登录状态,并且根据不同的状态,系统将展现不同的行为。

# Context 环境类 - User
class User:def __init__(self):self._state = Nonedef set_state(self, state):self._state = statedef get_state(self):return self._statedef perform_action(self):self._state.perform_action()# State 状态接口
class State:def perform_action(self):pass# ConcreteState 具体状态类
class LoggedInState(State):def perform_action(self):print("Performing actions for a logged-in user.")class LoggedOutState(State):def perform_action(self):print("Performing actions for a logged-out user.")# 使用示例
user = User()
user.set_state(LoggedInState())
user.perform_action()  # 输出:Performing actions for a logged-in user.user.set_state(LoggedOutState())
user.perform_action()  # 输出:Performing actions for a logged-out user.

在这个示例中,User 是环境类,维护一个状态对象的引用,State 是状态接口,LoggedInStateLoggedOutState 是具体状态类。根据用户的状态,可以执行不同的操作。当用户登录或退出登录时,状态会相应地改变,系统将展现不同的行为。


使用状态设计模式时,需要注意哪些地方?

  1. 状态切换的逻辑: 确保状态之间的转换逻辑清晰和合理。状态切换可能会受到某些条件或事件的影响,确保状态转换的逻辑正确性。

  2. 状态的数量: 状态设计模式适用于有限数量的状态。如果状态过多,可能会导致类的数量急剧增加,使得系统变得复杂。

  3. 状态的一致性: 确保状态对象在不同状态下表现出一致的接口和行为,保持状态之间的一致性。

  4. Context 对象的状态管理: Context 对象需要维护当前状态,并在状态变化时更新其状态。确保 Context 对象正确地管理和切换状态。

  5. 状态间的通信: 状态之间可能需要进行通信,例如在状态切换时传递数据或信息。确保状态之间的通信方式合理可靠。

  6. 单一职责原则: 确保每个具体状态类只关注特定状态下的行为,遵循单一职责原则,保持代码的清晰度和可维护性。

  7. 测试和验证: 对状态设计模式进行充分的测试和验证,确保状态切换和对象行为符合预期。

  8. 选择合适的模式: 状态设计模式并不适用于所有情况。在确定使用状态模式之前,要考虑是否有更适合的模式来解决问题。

综上所述,使用状态设计模式时需要注意状态之间的切换逻辑、状态的一致性、Context 对象的状态管理等方面,以确保模式的正确性和系统的可维护性。


本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

相关文章:

状态设计模式是什么?什么是 State 状态设计模式?Python 状态设计模式示例代码

什么是 State 状态设计模式? 状态设计模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变其行为,使其看起来好像改变了其类。状态模式主要解决的问题是:当一个对象的行为取决于它的状态,并且在运行时…...

电力感知边缘计算技术网关产品设计方案-硬件方案

网关硬件架构设计图: 1.配置方案 配置差异 A类网关 B类网关 CPU...

【线性代数与矩阵论】坐标变换与相似矩阵

坐标变换与相似矩阵 2023年11月4日 #algebra 文章目录 坐标变换与相似矩阵1. 基变换与坐标变换2. 相似变换下链 1. 基变换与坐标变换 坐标变换与基变换都要通过过渡矩阵 A A A 来实现。设有一向量 f ⃗ \vec f f ​ , x x x 是在基 α \alpha α 下该向量的坐标…...

C语言编译过程再解析

多年以前,分析过编译过程,并写了一篇博客,现在对编译过程有了更广阔的认识,记录在此 编译过程 中的 链接与 编译 编译过程分为1. 预处理2. 编译3. 汇编4. 链接其中有 2个过程比较特殊,1. 编译2. 链接对于C程序来说,链接分为提前链接(静态链接)对应下图第1行运行时链接(动态链…...

GeoTrust证书

GeoTrust证书的特点与优势: 1,广泛的浏览器兼容性: GeoTrust证书得到了各大主流浏览器的广泛支持,确保您的网站能够在用户使用的任何浏览器上获得正常的安全连接。 2,强大的加密技术: GeoTrust采用先进的…...

肾合胶囊 | 冬不养肾春易病,若出现了这六大表现,小心是肾虚!

冬季作为一年中最寒冷的季节,自然万物皆静谧闭藏,而肾具有潜藏、封藏、闭藏精气的特点,是封藏之本,肾的脏腑特性与冬季相通应,所以在冬季更应该重视养肾。 而现在正值初冬,正是开始养肾的最佳时间。此时培…...

IDEA中常用快捷键

整理了一些IDEA开发常用的快捷键: 快捷键组合实现效果psvm Tab键 / main Tab键public static void main(String[] args)sout Tab键System.out.println()Ctrl X删除当前行Ctrl D复制当前行AltInsert(或右键Generate)生成代码(如get,set方法,构造函数等)CtrlAltT…...

注解之@Configuration、@Bean、@Component

目录 前言 Component:通用的注解! Bean 引入第三方的类 Configuration 前言 首先:我们先简单描述一下这三个的作用 Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。 Bean注解告诉Spring这个方法将会…...

【Web安全】sql注入绕过技法

sql注入绕过技法 1. 注释符号绕过 原理:SQL注释符号(如--, /* */)可以用来忽略查询的一部分,特别是在注入点之后的部分。这对于绕过需要闭合的查询或移除查询余下部分的情况特别有用。 -- 注释内容 # 注释内容 /*注释内容*/ ;2…...

Axios使用方式

ajax是JQUERY封装的XMLHttprequest用来发送http请求 Axios简单点说它就是一个js库,支持ajax请求,发送axios请求功能更加丰富,丰富在哪不知道 1.npm使用方式 vue项目中 npm install axios 2.cdn方式 <script src"https://unpkg.com/axios/dist/axios.min.js">…...

kotlin 内置函数对数组进行各种操作

以下是一些常见的用法示例&#xff1a; plus() 函数将两个数组合并成一个数组。plus() 函数是 Kotlin 标准库中的一个扩展函数&#xff0c;可以用于合并两个同类型的数组。 fun main() {val array1 arrayOf(1, 2, 3)val array2 arrayOf(4, 5, 6)val mergedArray array1.plu…...

力扣labuladong——一刷day54

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣1660. 纠正二叉树二、力扣100. 相同的树三、力扣572. 另一棵树的子树四、力扣101. 对称二叉树 前言 判断树是否相等&#xff0c;就直接遍历就可以。判断…...

3、MSF使用

文章目录 一、利用ms17-010漏洞对靶机执行溢出攻击二、后渗透模块meterpreter的使用 一、利用ms17-010漏洞对靶机执行溢出攻击 分别输入以下命令&#xff0c;使用ms17_010_eternalblue模块对目标机的ms17-010漏洞进行利用&#xff1a; use exploit/windows/smb/ms17_010_eter…...

34970A 数据采集 / 数据记录仪开关单元

34970A 数据采集 / 数据记录仪开关单元 产品综述&#xff1a; Keysight 34970A 数据采集/数据记录仪开关单元由一个 3 插槽主机和一个内置的 6 1/2 位数字万用表组成。每个通道可以单独配置&#xff0c;以测量 11 种不同功能之一&#xff0c;这样既不会增加成本&#xff0c;也…...

BUUCTF刷题之路-web-[GXYCTF2019]Ping Ping Ping1

启动环境后&#xff0c;是一个简简单单的页面&#xff1a; 看样子是能够触发远程执行漏洞的。尝试下ping 127.0.0.1&#xff0c;如果有回显说明我们的想法是对的。 最近才学习的nc反弹shell。想着是否能用nc反弹shell的办法。控制服务器然后输出flag呢&#xff1f;于是我测试下…...

一、深入简出串口(USRT)通信——基本概念。

一、前言 串口到底是什么&#xff1f;简单来说一句话就可以解释&#xff0c;串口就是一种通信协议。 看到这里可能大家会觉得你这不是放屁么&#xff0c;说了跟没说一样。所以这里做前言来描述&#xff0c;大家要先对通信协议有一个下意识地认识才能在学习串口的时候不至于迷茫…...

采用connector-c++ 8.0操作数据库

1.下载最新的Connector https://dev.mysql.com/downloads/connector/cpp/&#xff0c;下载带debug的库。 解压缩到本地&#xff0c;本次使用的是带debug模式的connector库&#xff1a; 注&#xff1a;其中mysqlcppconn与mysqlcppconn8的区别是&#xff1a; 2.在cmakelist…...

【Java数据结构 -- 时间和空间复杂度】

时间和空间复杂度 1. 算法效率2. 时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3 推导大O阶方法2.4 常见时间复杂度计算举例例1例2例3例4 计算 bubbleSort的时间复杂度例5 计算binarySearch的时间复杂度&#xff1f;例6 计算阶乘递归factorial的时间复杂度&#xff1f;…...

【每日一题】1457. 二叉树中的伪回文路径-2023.11.25

题目&#xff1a; 1457. 二叉树中的伪回文路径 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路…...

能让PDF看起来像是扫描件的Look Scanned

什么是 Look Scanned ? Look Scanned 是一个能够让 PDF 看起来就像是扫描件一样的纯前端网站。你再也不需要麻烦地打印之后扫描了&#xff0c;你所需要的就是鼠标点几下。 这是个挺有意思的软件&#xff0c;但是老苏不确定什么场景下会用到这个软件&#xff0c;如果不想自己搭…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...