news 2026/4/15 9:01:23

2025--简单点--python之状态模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2025--简单点--python之状态模式

一个context有可以切换多个state,切换到不同的state可以做不同的handle。
该模式将与状态相关的行为抽取到独立的状态类中, 让原对象将工作委派给这些类的实例, 而不是自行进行处理。

from__future__importannotationsfromabcimportABC,abstractmethodclassContext:""" The Context defines the interface of interest to clients. It also maintains a reference to an instance of a State subclass, which represents the current state of the Context. """_state=None""" A reference to the current state of the Context. """def__init__(self,state:State)->None:self.transition_to(state)deftransition_to(self,state:State):""" The Context allows changing the State object at runtime. """print(f"Context: Transition to{type(state).__name__}")self._state=state self._state.context=self""" The Context delegates part of its behavior to the current State object. """defrequest1(self):self._state.handle1()defrequest2(self):self._state.handle2()classState(ABC):""" The base State class declares methods that all Concrete State should implement and also provides a backreference to the Context object, associated with the State. This backreference can be used by States to transition the Context to another State. """@propertydefcontext(self)->Context:returnself._context@context.setterdefcontext(self,context:Context)->None:self._context=context@abstractmethoddefhandle1(self)->None:pass@abstractmethoddefhandle2(self)->None:pass""" Concrete States implement various behaviors, associated with a state of the Context. """classConcreteStateA(State):defhandle1(self)->None:print("ConcreteStateA handles request1.")print("ConcreteStateA wants to change the state of the context.")self.context.transition_to(ConcreteStateB())defhandle2(self)->None:print("ConcreteStateA handles request2.")classConcreteStateB(State):defhandle1(self)->None:print("ConcreteStateB handles request1.")defhandle2(self)->None:print("ConcreteStateB handles request2.")print("ConcreteStateB wants to change the state of the context.")self.context.transition_to(ConcreteStateA())if__name__=="__main__":# The client code.context=Context(ConcreteStateA())context.request1()context.request2()

output:
Context: Transition to ConcreteStateA
ConcreteStateA handles request1.
ConcreteStateA wants to change the state of the context.
Context: Transition to ConcreteStateB
ConcreteStateB handles request2.
ConcreteStateB wants to change the state of the context.
Context: Transition to ConcreteStateA

状态模式的优点

避免了过多的条件判断:状态模式通过将每个状态的行为封装到对应的类中,避免了在上下文中使用大量的条件判断语句(如if-else或switch-case)来根据状态执行不同的行为。

符合开闭原则:当需要增加新的状态时,只需要添加新的状态类,而不需要修改上下文类或其他状态类。
使状态转换更加明确:每个状态类只关心自己状态下的行为以及如何转换到其他状态,使得状态转换的逻辑更加清晰。

状态模式的缺点

  1. 增加了类的数量:每个状态都需要一个对应的类,可能会导致系统中类的数量增加。
  2. 状态转换逻辑分散:状态转换的逻辑分散在各个具体状态类中,可能会使得状态转换的整体逻辑不够直观。

适用场景

一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
一个操作中含有大量的条件语句,且这些条件依赖于对象的状态。

通过状态模式,我们可以将复杂的条件判断转换为状态类之间的转换,使得代码更加清晰和可维护。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 18:10:53

平板电脑语言设置在哪?咋添加切换?看这篇就懂

语言设置是平板电脑使用的基础。它不仅决定了屏幕上显示的文字,更影响了输入法、语音助手、应用商店乃至整个操作系统的交互逻辑。选对语言,能让设备用起来得心应手;设置不当,则可能带来持续的困扰。下面将从几个关键问题入手&…

作者头像 李华
网站建设 2026/4/10 21:37:59

JavaScript中如何监听浏览器后退按钮事件及常见问题

在Web开发中,处理浏览器的后退按钮行为是一个常见但容易被忽视的细节。它直接关系到单页面应用(SPA)的路由状态管理、用户操作流程的连贯性以及是否会产生意料之外的页面跳转。理解并正确监听后退事件,对于提升应用交互逻辑的健壮性至关重要。 如何监听浏…

作者头像 李华
网站建设 2026/4/14 0:40:58

Open WebUI图表集成快速上手指南:三步搞定数据可视化

Open WebUI图表集成快速上手指南:三步搞定数据可视化 【免费下载链接】open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI,设计用于完全离线操作,支持各种大型语言模型(LLM)运行器,包…

作者头像 李华
网站建设 2026/4/10 11:15:59

ServerPackCreator终极指南:从零开始构建专业级Minecraft服务器

ServerPackCreator终极指南:从零开始构建专业级Minecraft服务器 【免费下载链接】ServerPackCreator Create a server pack from a Minecraft Forge, NeoForge, Fabric, LegacyFabric or Quilt modpack! 项目地址: https://gitcode.com/gh_mirrors/se/ServerPackC…

作者头像 李华
网站建设 2026/4/7 16:13:45

计算机答辩问题推荐:8大平台+AI生成答

计算机答辩问题推荐:8大平台AI生成答 8大答辩辅助平台对比速览 平台名称 核心功能 处理速度 适用场景 特色优势 Aibiye AI生成人工改写 20分钟 文献综述/技术方案 降AIGC率15% 橙篇 语料库改写 实时 开题报告/方法论 百度学术模式 千笔AI 无限免费…

作者头像 李华
网站建设 2026/4/6 0:53:11

降AIGC网站排名:10大平台+免费高效推荐

降AIGC网站排名:10大平台免费高效推荐 10大降AIGC工具对比速览 排名 工具名称 处理时间 AIGC降幅 适用场景 免费额度 1 秒篇 20分钟 降至个位 学术论文深度优化 部分免费 2 aibiye 20分钟 降至个位 AI生成内容专业处理 部分免费 3 aicheck 25分…

作者头像 李华