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

一、说明
状态模式是一种行为设计模式,用于解决对象在不同状态下具有不同行为
(一) 解决问题
在对象行为根据对象状态而改变时,规避使用大量的条件语句来判断对象的状态,提高系统可维护性
(二) 使用场景
- 当对象的行为取决于其状态,并且该状态可以在运行时动态改变时
- 当有大量的条件语句用于控制对象的行为,并且这些条件在不同的状态下具有不同的表现时
二、结构

- 上下文(Context)保存了对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。
- 状态(State)接口会声明特定于状态的方法。这些方法应能被其他所有具体状态所理解,因为你不希望某些状态所拥有的方法永远不会被调用。
- 具体状态(ConcreteStates)会自行实现特定于状态的方法。为了避免多个状态中包含相似代码,你可以提供一个封装有部分通用行为的中间抽象类。状态对象可存储对于上下文对象的反向引用。状态可以通过该引用从上下文处获取所需信息,并且能触发状态转移。
- 上下文和具体状态都可以设置上下文的下个状态,并可通过替换连接到上下文的状态对象来完成实际的状态转换。
三、伪代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
状态模式例:水在不同温度下状态也会不同
"""from abc import ABC, abstractmethodclass State(ABC):"""状态基类"""@abstractmethoddef handle(self, temperature):passclass 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 = statedef 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博客
相关文章:
【Python笔记-设计模式】状态模式
一、说明 状态模式是一种行为设计模式,用于解决对象在不同状态下具有不同行为 (一) 解决问题 在对象行为根据对象状态而改变时,规避使用大量的条件语句来判断对象的状态,提高系统可维护性 (二) 使用场景 当对象的行为取决于其状态&#…...
Pytorch 复习总结 5
Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 卷积神经网络。 本文先介绍了 Pytorch 语法汇总: Pytorch 张量的常见运算、…...
Codeforces Round 930 (Div. 2)
Codeforces Round 930 (Div. 2) Codeforces Round 930 (Div. 2) A. Shuffle Party 题意: 给出长度为n的整数数组a, a i a_i ai i,对于k>2的下标进行运算,设d为k除本身外最大的除数, 操作为交换( a k a_k ak…...
c语言求平方与倒数序列的部分和
本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m21/m(m1)21/(m1)⋯n21/n。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。 输出格式: 在一行中按照“sum S”的格式输出部分和…...
Vue-4
自定义创建项目 目标:基于 VueCli 自定义创建项目架子 大致步骤: 安装脚手架创建项目 vue create 项目名称选择自定义 选择 Manually select features 这一项 step-1:按下空格 : 选择/取消--勾选请选择:Babel、Router、CSS、Linterstep-2…...
【Acwing】差分矩阵
图1:a和b数组映射表 由于a是b的前缀和数组,因此改变b[ x1][ y1]之后,受到影响的a中元素如右半图所示 图2:求b数组的前缀和 #include<bits/stdc.h> using namespace std;int n,m,q; int a[1010][1010]; int b[1010][1010]…...
Linux系统加固:如何有效管理系统账号
Linux系统加固:如何有效管理系统账号 1.1 口令重复次数限制1.2 避免系统存在uid相同的账号1.3 空密码的帐户1.4 口令复杂度1.5 口令生存期1.6 登录失败次数锁定策略 💖The Begin💖点点关注,收藏不迷路💖 在Linux系统中…...
在Windows中安装PyTorch
文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…...
助力智能化农田作物除草,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统
在我们前面的系列博文中,关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了,结合智能化的设备可以实现只能除草等操作,玉米作物场景下的杂草检测我们则少有涉及,这里本文的主要目的就是想要基于YOLOv7系列的模型来开发…...
linux nasm汇编中调用printf不报错,但调用scanf报错。抛出了分段错误(核心转储)
当我写了如下汇编时 ; nasm -f elf64 -g -F dwarf charsin.asm ; gcc charsin.o -no-pie -o charsin ; ld -o eatclib eatclib.o ; gdb eatclib[SECTION .data]SPrompt db Enter string data, followed by Enter: ,0IPrompt db Enter an integer value, followed by Enter: ,1…...
Linux系统——Nginx负载均衡模式
目录 一、Nginx优点 二、Nginx配置项——Conf Upstream 模块 三、Nginx负载均衡 1.负载均衡策略 1.1轮询 1.2IP_hash 1.3URL_hash 1.4Least_conn 1.5Weight 1.6Fair 2.Nginx负载均衡配置状态参数 3.什么是会话保持 3.1会话保持有什么作用呢 3.2Nginx会话保持 3…...
【自然语言处理之语言模型】讲解
自然语言处理之语言模型 1. 前言2. 传统语言模型3. 神经语言模型4. 训练语言模型5. 评估语言模型6. 总结 1. 前言 自然语言处理(Natural Language Processing,NLP)是计算机科学、人工智能和语言学交叉的一个领域,它研究计算机和人…...
输入一个整数n,输出这个整数的二进制的0和1的个数
输入一个整数n,输出这个整数的二进制的0和1的个数:除二取余法 代码: #include <cstdio> int main() {int n;scanf_s("%d", &n);int arr[2] { 0 };while (n) {int yu n % 2;arr[yu];n n / 2;}printf("0的个数是:…...
初阶数据结构:链表相关题目练习(补充)
目录 1. 单链表相关练习题1.1 移除链表元素1.2 反转链表1.3 链表的中间结点1.4 链表的倒数第k个结点1.5 合并两个有序链表1.6 链表分割1.7 链表的回文结构1.8 相交链表1.9 判断一个链表中是否有环1.10 寻找环状链表相遇点1.11 链表的深度拷贝 1. 单链表相关练习题 注࿱…...
java: 错误: 不支持发行版本 5
目录 一、问题描述 二、解决办法 方法一:修改idea设置中的jdk版本 方法二:配置pom.xml文件 方法三:配置maven的xml文件(推荐) 三、结果 一、问题描述 问题描述:今天创建了一个maven项目,…...
springSecruity--->和springboot结合的跨域问题
🤦♂️这个是我在springboot中使用springSecruity写一个小demo时遇到的问题,记录下来🤦♂️ 文章目录 跨域请求springboot项目中使用springSecruity导致跨域请求CrossOrigin请求失效解决方法springboot 中的跨域方法 跨域请求 什么是跨…...
网关kong记录接口处理请求和响应插件 tcp-log-with-body的安装
tcp-log-with-body 介绍 Kong的tcp-log-with-body插件是一个高效的工具,它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景,尤其是在调试和排查问题时。 软件环境说明 kong version 2.1.4 - 2.8.3 [可用亲测]C…...
ElasticSearch之Completion Suggester
写在前面 通过completion suggester可以实现如下的效果: 其实就是做的like xxx%这种。通过FST这种数据结构来存储,实现快速的前缀匹配,并且可以将es所有的数据加载到内存中所以速度completion的查询速度非常快。 需要注意,如果…...
ant 布局组件 组件等高设置
背景: 想实现一个和content等高的侧边栏,并增加侧边栏导航。 ant组件概述 Layout:布局容器,其下可嵌套 Header Sider Content Footer 或 Layout 本身,可以放在任何父容器中。Header:顶部布局,…...
不可多得的干货,网易的朋友给我这份339页的Android面经
这里先放上目录 一 性能优化 1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度。 首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。 UI布局的分析,可以有2块&#x…...
Janus-Pro-7B在C语言教学中的应用:智能代码纠错与讲解
Janus-Pro-7B在C语言教学中的应用:智能代码纠错与讲解 最近在琢磨怎么让C语言教学更高效,特别是对于初学者来说,那些让人头疼的语法错误和逻辑漏洞,往往一卡就是半天。传统的教学方式,要么是老师一对一讲解࿰…...
3分钟快速查询:手机号查QQ号Python工具使用指南
3分钟快速查询:手机号查QQ号Python工具使用指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾需要快速查询手机号对应的QQ号,却苦于没有便捷的工具?手机号查QQ号工具正是为解决这一痛点…...
Tinymist编辑器集成指南:从VS Code到Neovim的完美配置
Tinymist编辑器集成指南:从VS Code到Neovim的完美配置 【免费下载链接】tinymist Tinymist [ˈtaɪni mɪst] is an integrated language service for Typst [taɪpst]. 项目地址: https://gitcode.com/gh_mirrors/ti/tinymist Tinymist是一个为Typst语言提供…...
2024届芯片秋招实战复盘:华为海思器件岗的面试密码与避坑指南
1. 华为海思器件岗秋招全景透视 2024届芯片秋招已经拉开帷幕,作为国内半导体行业的标杆企业,华为海思的器件工程师岗位吸引了无数微电子、材料科学专业学子的目光。我以亲历者的视角复盘这场持续三个月的"技术马拉松",发现今年的招…...
告别云端API:手把手教你用Meta MMS-TTS在本地电脑合成藏语语音(Python保姆级教程)
本地化藏语语音合成实战:基于Meta MMS-TTS的Python全流程指南 藏语作为重要的少数民族语言,其数字化处理一直面临独特挑战。传统云端语音合成方案存在延迟高、数据隐私风险等问题,而Meta开源的MMS-TTS模型为本地化藏语合成提供了新可能。本文…...
从Excel到Cadence:基于ODBC的智能元件库构建与实战
1. 为什么需要智能元件库管理 每次画原理图最头疼的就是找元件符号和封装对不对?我见过太多工程师的电脑桌面上堆满了各种版本的元件库,每次新建项目都要花半天时间核对封装是否匹配。更可怕的是,当某个元件参数需要更新时,得在所…...
B站缓存视频无法播放?m4s-converter让您的收藏永不消失
B站缓存视频无法播放?m4s-converter让您的收藏永不消失 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在数字内容爆炸的时代&#x…...
DeepAudit实战:揭秘多智能体如何协同作战,实现企业级代码安全自动化审计
1. 为什么企业需要代码安全自动化审计 最近几年,我接触过不少企业的技术负责人,他们最头疼的问题之一就是代码安全问题。传统的人工代码审计方式,就像是用放大镜一寸寸检查整栋大楼的墙面裂缝,不仅效率低下,而且成本惊…...
别再手动调参了!用skLearn的RidgeCV自动选择岭回归最佳alpha(附加州房价实战)
告别手动调参时代:用RidgeCV实现岭回归超参数智能优化 在数据科学项目中,模型调参往往是最耗时的环节之一。以岭回归为例,传统方法需要手动绘制岭迹图、反复调整正则化参数alpha,整个过程既繁琐又依赖经验。而sklearn的RidgeCV模块…...
Hermes Agent:从自进化智能体到分布式生产力内核的深度研究报告
文章目录 一、 纵向分析:Hermes Agent 的诞生、演化与智能复利的积累1. 起源追溯:去中心化理想与大模型“失忆症”的对抗2. 诞生的前奏:基础设施的垂直整合与技术蓄力3. 诞生节点:2026 年初的“自生长”宣言4. 演进历程࿱…...
