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

【Python笔记-设计模式】状态模式

一、说明

状态模式是一种行为设计模式,用于解决对象在不同状态下具有不同行为

(一) 解决问题

在对象行为根据对象状态而改变时,规避使用大量的条件语句来判断对象的状态,提高系统可维护性

(二) 使用场景

  • 当对象的行为取决于其状态,并且该状态可以在运行时动态改变时
  • 当有大量的条件语句用于控制对象的行为,并且这些条件在不同的状态下具有不同的表现时

二、结构

  1. 上下文(Context)保存了对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。
  2. 状态(State)接口会声明特定于状态的方法。这些方法应能被其他所有具体状态所理解,因为你不希望某些状态所拥有的方法永远不会被调用。
  3. 具体状态(ConcreteStates)会自行实现特定于状态的方法。为了避免多个状态中包含相似代码,你可以提供一个封装有部分通用行为的中间抽象类。状态对象可存储对于上下文对象的反向引用。状态可以通过该引用从上下文处获取所需信息,并且能触发状态转移。
  4. 上下文和具体状态都可以设置上下文的下个状态,并可通过替换连接到上下文的状态对象来完成实际的状态转换。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
状态模式例:水在不同温度下状态也会不同
"""from abc import ABC, abstractmethodclass State(ABC):"""状态基类"""@abstractmethoddef handle(self, temperature):passclass SolidState(State):"""具体状态类"""def handle(self, temperature):if temperature < 0:return "冰"class LiquidState(State):"""具体状态类"""def handle(self, temperature):if 0 <= temperature < 100:return "液态水"class GaseousState(State):"""具体状态类"""def handle(self, temperature):if temperature >= 100:return "水蒸气"class Water:"""上下文类(水)"""def __init__(self):self.state = LiquidState()def change_state(self, state):self.state = statedef get_state(self, temperature):return self.state.handle(temperature)if __name__ == '__main__':"""水在 25 摄氏度时为:液态水水在 -5 摄氏度时为:冰水在 105 摄氏度时为:水蒸气"""water = Water()print(f"水在 25 摄氏度时为:{water.get_state(25)}")water.change_state(SolidState())print(f"水在 -5 摄氏度时为:{water.get_state(-5)}")water.change_state(GaseousState())print(f"水在 105 摄氏度时为:{water.get_state(105)}")

四、优缺点

优点

  • 开闭原则:无需修改已有状态类和上下文就能引入新状态
  • 通过消除臃肿的状态机条件语句简化上下文代码

缺点

  • 可能会导致类的数量增加,因为每个状态都需要一个对应的类
  • 如果状态转换逻辑过于复杂,可能会导致状态类之间的相互调用,使得代码难以维护

【Python笔记】设计模式-CSDN博客

相关文章:

  • 在极狐GitLab 配置 SSL/https
  • oracle DG 原理
  • 一张照片一键换脸:无需数据集和训练 | 开源日报 No.186
  • flutter 学习(二)AS创建flutter项目,一直卡在create,特别慢
  • centos物理电脑安装过程(2024年1月)
  • Vue+SpringBoot打造音乐偏好度推荐系统
  • 本地快速部署谷歌开放模型Gemma教程(基于WasmEdge)
  • 美国高防服务器租用要点一般是什么?
  • CY8C42(1.PSoC4 Pioneer Kit开箱及基本使用)
  • MATLAB读取txt文本数据及可视化指南
  • WiFi模块引领智能家居革命:连接未来的生活
  • python笔记_键盘输入
  • Python爬虫实战:从API获取数据
  • SQL 语句创建数据库
  • 【SadTalker】源码部署搭建HTTP服务
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 〔开发系列〕一次关于小程序开发的深度总结
  • css的样式优先级
  • GitUp, 你不可错过的秀外慧中的git工具
  • SOFAMosn配置模型
  • 闭包,sync使用细节
  • 多线程 start 和 run 方法到底有什么区别?
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 将 Measurements 和 Units 应用到物理学
  • 聚类分析——Kmeans
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 微服务核心架构梳理
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #162 (Div. 2)
  • #DBA杂记1
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (转)原始图像数据和PDF中的图像数据
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ..回顾17,展望18
  • .naturalWidth 和naturalHeight属性,
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET中GET与SET的用法
  • .Net中的集合
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [2]十道算法题【Java实现】
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [BZOJ4010]菜肴制作
  • [C#]winform部署PaddleOCRV3推理模型
  • [hdu4622 Reincarnation]后缀数组
  • [json]定义、读写