状态模式:管理对象状态转换的动态策略

news2024/11/26 4:30:43

在软件开发中,状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为。这种模式把与特定状态相关的行为局部化,并且将不同状态的行为分散到对应的状态类中,使得状态和行为可以独立变化。本文将详细介绍状态模式的定义、实现、应用场景以及优缺点。
在这里插入图片描述

1. 状态模式的定义

状态模式(State Pattern)使得一个对象能够在其内部状态改变时,改变其行为。这看起来像是该对象改变了它的类。状态模式主要涉及两个概念:上下文(Context)和状态(State)。上下文是用户主要交互的对象,持有一个指向当前状态对象的引用,该引用可以根据情况被替换成不同状态的对象。

2. 实现状态模式

在Python中,实现状态模式通常涉及创建一个状态接口和多个具体状态类。以下是状态模式的一个简单实现示例:

from abc import ABC, abstractmethod

class State(ABC):
    """状态抽象基类"""
    @abstractmethod
    def handle(self, context):
        pass

class ConcreteStateA(State):
    """具体状态A"""
    def handle(self, context):
        print("Turning from State A to State B")
        context.state = ConcreteStateB()

class ConcreteStateB(State):
    """具体状态B"""
    def handle(self, context):
        print("Turning from State B to State A")
        context.state = ConcreteStateA()

class Context:
    """上下文类,维持一个指向当前状态对象的引用"""
    def __init__(self, state):
        self._state = state

    @property
    def state(self):
        return self._state

    @state.setter
    def state(self, value):
        self._state = value

    def request(self):
        self._state.handle(self)

# 客户端代码
context = Context(ConcreteStateA())
context.request()  # 输出: Turning from State A to State B
context.request()  # 输出: Turning from State B to State A

3. 状态模式的应用实例

状态模式在多种场景中非常有用,尤其适用于:

  • 工作流管理:如工作流或游戏中的状态管理。
  • UI控件状态:不同状态下UI控件的行为。
  • 门的状态:如一个自动门可以有打开、关闭和锁定状态。

4. 优点和缺点

优点:

  • 封装了转换规则。
  • 枚举可能的状态,在编译时间内发现不兼容的状态转换。
  • 将所有与某个状态相关的行为都放入一个对象中。

缺点:

  • 如果状态多且复杂,会导致状态类的增多,系统变得复杂。

5. 总结

状态模式是处理对象在不同状态转换时行为的有效方式,它提供了一种清晰的方式来组织涉及状态的代码,适合处理复杂的状态逻辑问题。

更多Python编程相关文章:cpython666.github.io

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

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

相关文章

【vue】defineProps 传数据 父传子

先行知识 【vue】导入组件 传值过程 App.vue <template><Header name"1234567890" url"https://www.1234567890.com" /><hr><!-- <Footer v-bind"propsWeb" /> --><Footer :"propsWeb" /><h…

elementui中el-select下拉列表偏移问题

问题截图 解决方法 在el-select中添加:popper-append-to-body"false"即可 加完后的效果

2024-4-12-实战:商城首页(下)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业小结 作业 .bg-backward {width: 60px; height: 60px;background: url(..…

uni-app的页面中使用uni-map-common的地址解析(地址转坐标)功能,一直报请求云函数出错

想在uni-app的页面中使用uni-map-common的地址解析&#xff08;地址转坐标&#xff09;功能&#xff0c;怎么一直报请求云函数出错。 不看控制台啊,弄错了控制台&#xff0c;就说怎么一直没有打印出消息。 所以开始换高德地图的&#xff0c;昨天申请了两个 一开始用的第二个web…

物理服务器与云服务器的租用对比

​ 物理服务器&#xff1a;每个基于 Web 的应用程序都依赖于一个服务器&#xff0c;该服务器提供网络中的数据存储&#xff0c;并可根据请求提供给客户端。例如&#xff0c;用户使用浏览器访问 Web 应用程序。服务器可确保托管客户端可以使用该硬件组件。与其他托管可能性相比&…

【SpringBoot整合系列】SpringBoot整合Shiro——权限控制

目录 安全框架?安全框架都有哪些&#xff1f; 什么是RBAC?ShiroShiro核心组件Shiro的运行机制 SpringBoot整合Shiro整合思路1.引入依赖2.项目结构及配置3.创建前端页面index.jsplogin.jsp 4.自定义Realm5.自定义配置类6.启动测试 认证和退出1.在index.jsp添加a标签2.Controll…

Java | Leetcode Java题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n 0) {return 0;}int fast 1, slow 1;while (fast < n) {if (nums[fast] ! nums[fast - 1]) {nums[slow] nums[fast];slow;}fast;}return slow;}…

8路HDMI+8路AV高清视频流媒体编码器JR-3218HD

产品简介&#xff1a; JR-3218HD高清音视频编码产品支持8路高清HDMI音视频采集功能&#xff0c;8路AV视频采集功能&#xff0c;8路3.5MM独独立音频接口采集功能。编码输出双码流H.264格式&#xff0c;音频MP3/AAC格式。编码码率可调&#xff0c;画面质量可控制。支持HTTP/RTSP…

2024年蓝桥杯40天打卡总结

2024蓝桥杯40天打卡总结 真题题解其它预估考点重点复习考点时间复杂度前缀和二分的两个模板字符串相关 String和StringBuilderArrayList HashSet HashMap相关蓝桥杯Java常用算法大数类BigInteger的存储与运算日期相关考点及函数质数最小公倍数和最大公约数排序库的使用栈Math类…

服务器代理

服务器代理 配置&#xff1a;64G内存1 3090&#xff08;24g&#xff09;1P4000&#xff08;8g&#xff09; SSH连接 工作路径&#xff1a;/home/ubuntu/workspace/python Anaconda路径&#xff1a;/home/Ubuntu 1.在工作路径下创建自己的文件夹作为workspace 2.以用户ubunbtu登…

设备树下的 LED 驱动实验

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、修改设备树文件2创建设备树节点并获取属性 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发…

《师兄啊师兄》:玄机科技打造国漫新高峰,IP运营再显神力

在这个国漫蓬勃发展的时代&#xff0c;玄机科技再次以其超凡的制作水准和出色的IP运营能力&#xff0c;为我们带来了一部国漫新经典——《师兄啊师兄》。这部作品不仅在画面、剧情上达到了行业新高度&#xff0c;更在IP运营上展现出了其强大的实力与前瞻性。 《师兄啊师兄》的画…

easyui combobox下拉框组件输入检索全模糊查询

前引&#xff1a; easyui下拉组件&#xff08;combobox&#xff09;&#xff0c;输入检索下拉内容&#xff0c;是默认的右模糊匹配&#xff0c;而且不支持选择。因业务要求需要做成全模糊查询&#xff0c;目前网上搜索有两种方案&#xff1a; 1.修改easyui源码&#xff0c;这个…

Redis搭建主从

Redis搭建主从: 1:拉取Redis镜像 docker pull redis2:创建主从对应的目录结构 3:对redis6379.log,redis6380.log,redis6381.log进行授权 chmod 777 redis6379.log chmod 777 redis6380.log chmod 777 redis6381.log4:修改主(master)的配置文件 5:创建主(master) redis_6379 …

基于Whisper语音识别的实时视频字幕生成 (一): 流式显示视频帧和音频帧

Whishow Whistream&#xff08;微流&#xff09;是基于Whisper语音识别的的在线字幕生成工具&#xff0c;支持rtsp/rtmp/mp4等视频流在线语音识别 1. whishow介绍 whishow&#xff08;微秀&#xff09;是python实现的在线音视频流播放器&#xff0c;支持rtsp/rtmp/mp4等流式输…

设计模式——命令模式14

命令模式&#xff1a;用构造函数将 命令实现者 传递给 调用者。 例如下面 小贩进货 设计模式&#xff0c;一定要敲代码理解 命令抽象 /***文具* */ public interface Stationery {void make(); }命令实现类 public class Pencil implements Stationery{private Producer pr…

LLamaSharp加载llama.cpp转化好的模型

新建.net8控制台项目 安装依赖包 LLamaSharp和LLamaSharp.Backend.Cpu 准备好转化好的模型 没有的话参考这篇文章https://blog.csdn.net/qq_36437991/article/details/137248622 编写代码 using LLama; using LLama.Common; using LLama.Native;namespace llamasharpstu…

视频这么长,有必要浪费时间看吗?#知识社群N3

在这个信息爆炸的时代&#xff0c;我们每天都会被大量的二手信息包围。不论是社交媒体、新闻还是网络论坛&#xff0c;处处充斥着别人的观点和总结。但这些二手信息真的能够代替我们去源头获取内容吗&#xff1f;信息的片面性、观点的偏颇乃至于事实的曲解&#xff0c;不断地在…

FRDM-MCXN947开发板之RGB灯

一、背景 RGB LED&#xff1a;通过红、绿、蓝三种颜色组合发光的LED&#xff0c;可以理解由三个不同发光属性的LED组成&#xff0c;这个是LCD平板显示原理的基础&#xff0c;一个LED相当于屏幕上面的一个像素 FRDM-MCXN947集成了一块RGB LED&#xff0c;它由三个GPIO口驱动&am…

【C++】详解类的--封装思想(让你丝滑的从C语言过度到C++!!)

目录 一、前言 二、【面向过程】 与 【面向对象】 三、结构体 与 类 &#x1f34e;C中结构体的变化 &#x1f349;C中结构体的具体使用 &#x1f350;结构体 --> 类 ✨类-----语法格式&#xff1a; ✨类的两种定义方式&#xff1a; 四、类的访问限定符及封装【⭐】 …