【十一】python状态设计模式

一、引言

在软件设计中,设计模式是解决常见问题的最佳实践。它们提供了一种重用设计的方法,使得代码更易于理解、维护和扩展。状态设计模式是行为设计模式的一种,它允许对象在其内部状态改变时改变其行为。当控制一个对象的状态转换条件表达式过于复杂时,使用状态模式可以简化代码。

二、状态设计模式的定义

状态模式(State Pattern)允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。其意图是让一个对象在其内部状态改变的时候,其行为也随之改变。这个对象看起来就像是改变了它的类一样。

三、状态设计模式的结构

状态模式包含以下角色:

  • 环境(Context):持有当前状态,并定义客户端需要的接口。环境类可以将自身作为一个参数传递给处理请求的状态类方法,从而实现对环境的操作。
  • 抽象状态(State):定义一个接口以封装与环境的特定状态相关的行为。
  • 具体状态(Concrete State):实现抽象状态接口中所定义的方法。每个具体状态都表示一个可以相互转换的状态。

四、Python实现状态设计模式

让我们用一个简单的例子来充分了解该模式中的3 个参与者。假设要用一个简单的按钮来实现电视遥控器,执行开/关动作。如果电视打开,这个遥控器按钮将关闭电视,反之亦然。在这种情况下,state 接口将会定义相应的方法(例如,doThis))来执行诸如打开/关闭电视等操作。我们还需要定义 Concrete 类来处理不同的状态。在这个例子中,我们有两个主要状态,startstate和 stopstate,它们分别表示电视的打开状态和电视的关闭状态。
就本例来说,TVContext 类将实现 state 接口并维护对当前状态的引用。根据相应的请求,TVContext 将它们转发到相应的 Concretestate类,这个类实现了(针对给定状态的)实际行为,从而执行所需的操作。因此,在这种情况下,基本状态是 startstate(如前面定义的),TVContext 类接收的请求是关闭电视。TVContext 类可以理解该需求并相应地将它转发到 stopstate 相应的类,之后这个类就会从内部调用 doThis()方法来实际关闭电视:

下面是一个简单的Python代码示例,展示了如何使用状态模式:

from abc import abstractmethod, ABCMetaclass State(metaclass=ABCMeta):@abstractmethoddef doThis(self):passclass StartState(State):def doThis(self):print("TV Switching ON..")class StopState(State):def doThis(self):print("TV Switching OFF..")class TVContext(State):def __init__(self):self.state = Nonedef getState(self):return self.statedef setState(self, state):self.state = statedef doThis(self):self.state.doThis()context = TVContext()
context.getState()
start = StartState()
stop = StopState()
context.setState(stop)
context.doThis()

五、适用场景与优点

5.1 适用场景:

  • 对象的行为依赖于它的状态(属性)并且它会根据它的状态改变而改变它的相关行为。
  • 代码中包含大量与对象状态有关的条件语句,例如 switch-case 语句或 if-else 语句。使用状态模式可以将这些条件判断逻辑转移到不同状态类中,提高代码的可读性和可维护性。
  • 需要对对象的各种状态进行统一管理,且不同状态下对象的行为有较大差异。

5.2 优点:

  • 封装了状态的转换规则,在状态类中可以局部化状态的转换逻辑,避免了过多的条件判断。
  • 将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境对象拥有不同的行为。这样可以减少环境中的代码量,使其更加简洁清晰。
  • 允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块。这有利于代码的复用和扩展。

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

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

相关文章

Mac managing Multiple Python Versions With pyenv 【 mac pyenv 管理多个python 版本 】

文章目录 1. 简介2. 安装2.1 brew 安装 pyenv2.2 脚本安装 3. pyenv 安装 Python4. 卸载 python5. 管理 python 1. 简介 Pyenv 是一个用于管理和切换多个 Python 版本的工具。它允许开发人员在同一台计算机上同时安装和使用多个不同的 Python 版本,而无需对系统进行…

C/C++使用记录

1.使用指定宽度的整数类型 1.1 ISO C99在标准在文件stdint.h中引入了整数类型,格式如下: intN_t //有符号整数 unitN_t //无符号整数 注: N为指定宽度,例如 64位无符号整型:uint64_t 1.2 格式化输入/输出中,格式控…

Elasticsearch 索引生命周期和翻滚 (rollover) 策略

Elasticsearch 是搜索引擎中的摇滚明星,它的蓬勃发展在于使你的数据井井有条且速度快如闪电。 但当你的数据成为一场摇滚音乐会时,管理其生命周期就变得至关重要。 正确使用索引生命周期管理 (ILM) 和 rollover 策略,你的后台工作人员可确保顺…

万户OA text2Html接口存在任意文件读取漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网…

ABAP与HANA集成 2:ABAP调用HANA存储过程或SQL语句

作者 idan lian 如需转载备注出处 需求 虽然是做BW模块,但是最近项目上种种,都需要给ABAP人员或者前台用户提供能供他们使用的表,就稍微研究了下ABAP和HANA的集成问题,因为我们BW更擅长的还是HANA,而且HANA的运行效…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(二)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型(一) 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

NVMe前世今生

NVMe前世今生 1 NVMe的由来2 NVMe工作原理3 NVMe优点4 NVMe适用场景 本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。 1 NVMe的由来 目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口,接口协议为 AHCI&a…

vue + element 项目表格多选根据状态来禁用

首先如图效果 对elementUI中table表格的多选框进行 可勾选 和 不可勾选 的处理 给 type 属性为 selection 的加一个事件:selectableselected’ <el-table-column type"selection" width"55" :selectable"selected"> </el-table-colum…

SpringBoot集成Drools

版本 SpringBoot 3.2.0 JDK 17 Drools 9.44.0.Final pom.xml 相关依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version><relativePath/&g…

elementui el-pagination分页组件查询的时候当前页不更新

elementui el-pagination分页组件查询的时候当前页不更新 <mypagination v-if"pageshow" :currentPage.sync"pageNum" :pagesize"pageSize" :pagetotal"pageTotal" pagefunc"pageFunc"></mypagination>1.在加的…

运维知识点-Kubernetes_K8s

Kubernetes RBAC配置不当攻击场景攻击过程 RBAC配置不当 Service Account本质是服务账号&#xff0c;是Pod连接K8s集群的凭证。 在默认情况下&#xff0c;系统会为创建的Pod提供一个默认的Service Account&#xff0c; 用户也可以自定义Service Account&#xff0c;与Service…

目标检测——YOLO算法解读(通俗易懂版)

论文&#xff1a;You Only Look Once: Unified, Real-Time Object Detection 作者&#xff1a;Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi 链接&#xff1a;https://arxiv.org/abs/1506.02640 代码&#xff1a;http://pjreddie.com/yolo/ yolo系列检测算法开…

Excel小技能:excel如何将数字20231211转化成指定日期格式2023/12/11

给了一串数字20231211&#xff0c;想要转成指定格式的日期格式&#xff0c;发现设置单元格格式为指定日期格式不生效&#xff0c;反而变成很长很长的一串#这个&#xff0c;如图所示&#xff1a; 其实&#xff0c;正确的做法如下&#xff1a; 1&#xff09;打开数据功能界面&am…

谷达冠楠科技:抖音店铺被退店是什么意思

随着互联网的普及和发展&#xff0c;电商平台已经成为了人们购物的主要渠道之一。在众多的电商平台中&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;也吸引了大量的商家入驻。然而&#xff0c;有些商家可能会遇到抖音店铺被退店的情况&#xff0c;那么这究竟是什么意思呢…

病案管理的定义、流程及应用分析

病案管理是指针对病人的基本信息&#xff0c;病历&#xff0c;就诊记录等进行收集、整理、存储、分析和应用的一项管理工作。它在医院、医疗机构和医疗行业中具有重要的作用&#xff0c;能够提高医疗服务的质量、效率和安全性。本文将就病案管理的定义、流程以及其在医疗健康领…

Ubuntu22,通过Systemctl管理,加入开机启动项,实现服务或脚本开机自启

Ubuntu22,通过Systemctl管理,加入开机启动项,实现服务或脚本开机自启,方法如下 一、介绍 systemd 是 linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。systemd 和 ubuntu 的 upstart 是竞争对手,但是时至今日 ub…

React实现全局Loading

css #__loading {position:fixed;top: 0;left: 0;z-index: 99999;display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;background: rgba(0, 0, 0, 0); } 页面代码 使用了antd的Spin组件 import React from react import ReactDOM from re…

编程序中的魔法语句|循环-使用频率高的优雅代码

一. print和import的更多信息 1.1 使用逗号输出 A.打印多个表达式,用逗号隔开,会在每个参数之间插入一个空格符: 复制代码代码如下: >>> print age:,42 age: 42 B.同时输出文本和变量值,却又不希望使用字符串格式化: 复制代码代码如下: >>> name = Pe…

emmc存储大小解决方案

当发现emmc space 0.2G或者为0 的时候说名emmc有问题了&#xff0c;正常情况下是3.98G。 所以需要做如下处理&#xff1a; 输入&#xff1a;第一步&#xff1a;mkfs.ext4 /dev/mmcblk0p1 &#xff08;格式&#xff1a;mkfs.ext4 参数 设备名 原文链接&#xff1a;mkfs.ext4 命…

(c语言)字符逆序——非递归

#include<stdio.h> #include<string.h> int main(int argc, char* argv[]) {char a[10000];char b[10000];gets(a);int i, c;c (int)strlen(a);for (i 0; i < c; i){b[i] a[c-i-1]; //将\0之前的元素赋值给b[]}b[c] \0; //之后在所有元素后加上\0,将…