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

相关推荐
码云数智-园园9 小时前
优雅分页:Spring Boot 中 Pageable 参数的自动提取与全局复用实践
状态模式
PPPPickup17 小时前
easymall----管理后端分类展示
状态模式
前端不太难20 小时前
HarmonyOS 游戏运行态的完整状态机图
游戏·状态模式·harmonyos
前端不太难2 天前
HarmonyOS 为何用 Ability 约束游戏?
游戏·状态模式·harmonyos
新缸中之脑2 天前
5个AI设计的音乐 UI 比较
人工智能·ui·状态模式
前端不太难2 天前
游戏在 HarmonyOS 上如何“活”?
游戏·状态模式·harmonyos
浮游本尊3 天前
React 18.x 学习计划 - 第十三天:部署与DevOps实践
学习·react.js·状态模式
Vv1997_3 天前
JavaWeb后端全局异常处理
状态模式
小郎君。3 天前
PDF-知识图谱全流程前后端实现【工具已实现,搭建前后端pipline】
pdf·状态模式·知识图谱
前端不太难3 天前
HarmonyOS PC 焦点系统的正确建模方式
华为·状态模式·harmonyos