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

一、说明

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

(一) 解决问题

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

(二) 使用场景

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

二、结构

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

三、伪代码

python 复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
状态模式

例:水在不同温度下状态也会不同
"""

from abc import ABC, abstractmethod


class State(ABC):
    """状态基类"""

    @abstractmethod
    def handle(self, temperature):
        pass


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

    def 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博客

相关推荐
wrx繁星点点1 天前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
JungleCoding1 天前
403 Request Entity Too Lager(请求体太大啦)
状态模式
XYX的Blog2 天前
设计模式09-行为型模式2(状态模式/策略模式/Java)
设计模式·状态模式·策略模式
kevin_tech2 天前
Go API 多种响应的规范化处理和简化策略
开发语言·后端·golang·状态模式
denghai邓海3 天前
基于势能的平面运动模拟
python·平面·状态模式
JAVA开发区4 天前
设计模式之状态模式
设计模式·状态模式·状态转换
cgv36 天前
springboot2.x使用SSE方式代理或者转发其他流式接口
状态模式·springboot sse·sse流式接口·see代理流式接口·sse转发流式接口
mushangqiujin6 天前
ctfshow web入门文件上传总结
网络安全·状态模式
Yvemil76 天前
“高效开发之路:用Spring MVC构建健壮的企业级应用”
状态模式
wrx繁星点点8 天前
状态模式:封装对象状态并改变行为的设计模式
java·开发语言·spring·ui·设计模式·状态模式