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


    一、说明

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

    (一) 解决问题

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

    (二) 使用场景

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

    二、结构

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

    三、伪代码

    1. #!/usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. __doc__ = """
    4. 状态模式
    5. 例:水在不同温度下状态也会不同
    6. """
    7. from abc import ABC, abstractmethod
    8. class State(ABC):
    9. """状态基类"""
    10. @abstractmethod
    11. def handle(self, temperature):
    12. pass
    13. class SolidState(State):
    14. """具体状态类"""
    15. def handle(self, temperature):
    16. if temperature < 0:
    17. return "冰"
    18. class LiquidState(State):
    19. """具体状态类"""
    20. def handle(self, temperature):
    21. if 0 <= temperature < 100:
    22. return "液态水"
    23. class GaseousState(State):
    24. """具体状态类"""
    25. def handle(self, temperature):
    26. if temperature >= 100:
    27. return "水蒸气"
    28. class Water:
    29. """上下文类(水)"""
    30. def __init__(self):
    31. self.state = LiquidState()
    32. def change_state(self, state):
    33. self.state = state
    34. def get_state(self, temperature):
    35. return self.state.handle(temperature)
    36. if __name__ == '__main__':
    37. """
    38. 水在 25 摄氏度时为:液态水
    39. 水在 -5 摄氏度时为:冰
    40. 水在 105 摄氏度时为:水蒸气
    41. """
    42. water = Water()
    43. print(f"水在 25 摄氏度时为:{water.get_state(25)}")
    44. water.change_state(SolidState())
    45. print(f"水在 -5 摄氏度时为:{water.get_state(-5)}")
    46. water.change_state(GaseousState())
    47. print(f"水在 105 摄氏度时为:{water.get_state(105)}")

    四、优缺点

    优点

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

    缺点

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

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

  • 相关阅读:
    URL工具-URLUtil
    航拍飞行器经营商城小程序的作用是什么
    最佳日剧出炉
    游戏工作室为什么要使用海外住宅IP防封?
    基于单片机的指纹打卡机设计
    企业实施ERP系统遇到的问题及应对措施
    古琴必修律学原理,学古琴路上太重要的密码
    vivo 万台规模 HDFS 集群升级 HDFS 3.x 实践
    LeetCode【42】接雨水
    springboot整合mybatis入门程序
  • 原文地址:https://blog.csdn.net/weixin_44904331/article/details/136353128