【十】python状态设计模式

一、引言

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

二、状态设计模式的定义

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

三、状态设计模式的结构

状态模式包含以下角色:

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

四、Python实现状态设计模式

让我们用一个简单的例子来充分了解该模式中的3 个参与者。假设要用一个简单的按钮来实现电视遥控器,执行开/关动作。如果电视打开,这个遥控器按钮将关闭电视,反之亦然。在这种情况下,state 接口将会定义相应的方法(例如,doThis))来执行诸如打开/关闭电视等操作。我们还需要定义 Concrete 类来处理不同的状态。在这个例子中,我们有两个主要状态,startstate和 stopstate,它们分别表示电视的打开状态和电视的关闭状态。

就本例来说,TVContext 类将实现 state 接口并维护对当前状态的引用。根据相应的请求,TVContext 将它们转发到相应的 Concretestate类,这个类实现了(针对给定状态的)实际行为,从而执行所需的操作。因此,在这种情况下,基本状态是 startstate(如前面定义的),TVContext 类接收的请求是关闭电视。TVContext 类可以理解该需求并相应地将它转发到 stopstate 相应的类,之后这个类就会从内部调用 doThis()方法来实际关闭电视:

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

python 复制代码
from abc import abstractmethod, ABCMeta

class State(metaclass=ABCMeta):
    @abstractmethod
    def doThis(self):
        pass

class 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 = None

    def getState(self):
        return self.state

    def setState(self, state):
        self.state = state

    def 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 优点:

  • 封装了状态的转换规则,在状态类中可以局部化状态的转换逻辑,避免了过多的条件判断。
  • 将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境对象拥有不同的行为。这样可以减少环境中的代码量,使其更加简洁清晰。
  • 允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块。这有利于代码的复用和扩展。
相关推荐
kszlgy2 小时前
Day 52 神经网络调参指南
python
wrj的博客4 小时前
python环境安装
python·学习·环境配置
Pyeako4 小时前
深度学习--BP神经网络&梯度下降&损失函数
人工智能·python·深度学习·bp神经网络·损失函数·梯度下降·正则化惩罚
摘星编程5 小时前
OpenHarmony环境下React Native:Geolocation地理围栏
python
充值修改昵称5 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
q_35488851537 小时前
AI大模型:python新能源汽车推荐系统 协同过滤推荐算法 Echarts可视化 Django框架 大数据毕业设计(源码+文档)✅
大数据·人工智能·python·机器学习·信息可视化·汽车·推荐算法
Yeats_Liao7 小时前
开源生态资源:昇腾社区ModelZoo与DeepSeek的最佳实践路径
python·深度学习·神经网络·架构·开源
被星1砸昏头8 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
love530love8 小时前
彻底解决 ComfyUI Mixlab 插件 Whisper.available False 的报错
人工智能·windows·python·whisper·win_comfyui
不解风水9 小时前
《深度学习入门:基于 Python 的理论与实现》(斋藤康毅)
人工智能·python·深度学习