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

news/2024/9/1 11:49:02 标签: 状态模式

一、说明

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

(一) 解决问题

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

(二) 使用场景

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

二、结构

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

三、伪代码

#!/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博客


http://www.niftyadmin.cn/n/5399111.html

相关文章

cnpm报错 -npm ERR!request to https://registry.npm. taobao. org/cnpm failed, ...

解决方法 npm install -g cnpm --registryhttps://registry.npmmirror.com 前情 在安装依赖的时候&#xff0c;发现pnpm和npm安装都报错&#xff0c;然后想着试试cnmp 安装&#xff0c;结果全局没装&#xff0c;我就去装呀&#xff0c;结果。。。如下图&#xff1a; 就这个 …

node 之 npm

1.什么是包 node.js中的第三方模块又叫做包 就像电脑和计算机指的是相同的东西&#xff0c;第三方模块和包指的是同一个概念&#xff0c;只不过叫法不同 2.包的来源 不同于 Node.js 中的内置模块与自定义模块&#xff0c;包是由第三方个人或团队开发出来的&#xff0c;免费供所…

单片机精进之路-9ds18b20温度传感器

ds18b20复位时序图&#xff0c;先将b20的数据引脚拉低至少480us&#xff0c;然后再将数据引脚拉高15-60us&#xff0c;再去将测传感器的数据引脚是不是变低电平并保持60-240us&#xff0c;如果是&#xff0c;则说明检测到温度传感器&#xff0c;并正常工作。需要在240us后才能检…

LNMP架构介绍及配置--部署Discuz社区论坛与wordpress博客

一、LNMP架构定义 1、LNMP定义 LNMP&#xff08;Linux Nginx Mysql Php&#xff09;是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1b;Linux系统下NginxMySQLPHP这种网站服务器架构。 Linux是一类Unix计算机操作系统的统称&#xff0c;是目…

【Java编程进阶之路 06】深入探索:JDK、JRE与JVM的关系与差异

JDK、JRE与JVM&#xff1a;揭开Java运行环境的神秘面纱 在Java开发者的日常工作中&#xff0c;JDK、JRE和JVM这三个概念是不可或缺的。它们构成了Java应用程序的运行环境&#xff0c;但很多初学者可能对这三者的关系和差异感到困惑。本文旨在详细解析JDK、JRE和JVM之间的关系&…

Go开发 入门以VSCode为例

一、Go环境搭建 1.1 安装 进入Golang官网 https://go.dev&#xff0c;点击 Download 若无法打开网页可以使用国内的Go语言中文网 https://studygolang.com/dl 进入下载 找到合适的平台点击链接下载即可&#xff08;这里以Windows距离&#xff09; 下载完成后 Next Next 安…

同济大学高等数学第七版教材+习题全解指南PDF电子版

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、内容简介二、使用步骤1.引入库 前言 今天分享的是 同济大学高等数学第七版教材习题全解指南 一、内容简介 本书是同济大学数学系编的《高等数学》第七版…

蓝桥杯:真题讲解3(C++版)附带解析

报纸页数 来自&#xff1a;2016年七届省赛大学C组真题&#xff08;共8道题) 分析&#xff1a; --画出报纸长的样子&#xff0c;如果我们在上面多画一张报纸&#xff0c;那么就符合题意的5&#xff0c;6&#xff0c;11&#xff0c;12。 观察这张图&#xff1a;观察3&#xf…