python学习 - 设计模式 - 状态模式

大话设计模式
设计模式——状态模式
状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
(当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变他的行为)

#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : d1.py
# @Software: PyCharm"""场景上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬"""
"""面向过程的方式-方法版"""class MyType:def __init__(self):self.type = []self.flag = Falsedef main(self,time,WokerType=False):if time < 12:print "当前时间{%s}点,上午工作,精神百倍" % timeelif time < 13:print "当前时间{%s}点,饿了,午饭,犯困,午休." % timeelif time < 17:print "当前时间{%s}点,饿了,下午状态还不错,继续努力." % timeelse:if WokerType:print "当前时间{%s}点,下班回家." % timeelse:if time < 21:print "当前时间{%s}点,加班中.非常疲劳" % timeelse:print "当前时间{%s}点,完蛋了,睡着了!!" % timeif __name__ == '__main__':mytype = MyType()mytype.main(12)
#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : d2.py
# @Software: PyCharm
"""分类版"""
"""
1.方法过长坏味道! 违反单一职责,有很多判断责任太大了!
2.假如:要求所有人必须在二十点之前离开公司改动风险很大,违反开放-封闭原则
"""class Woker:def __init__(self, times, WokerType):self.__times = timesself.__WokerType = WokerTypedef WriteProgram(self):def main(self, time, WokerType=False):if time < 12:print "当前时间{%s}点,上午工作,精神百倍" % timeelif time < 13:print "当前时间{%s}点,饿了,午饭,犯困,午休." % timeelif time < 17:print "当前时间{%s}点,饿了,下午状态还不错,继续努力." % timeelse:if WokerType:print "当前时间{%s}点,下班回家." % timeelse:if time < 21:print "当前时间{%s}点,加班中.非常疲劳" % timeelse:print "当前时间{%s}点,完蛋了,睡着了!!" % timeif __name__ == '__main__':pass
#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : d3.py
# @Software: PyCharm
""""""
"""
状态模式(State): 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了类
主要解决:状态模式主要解决的是一个对象的状态转换条件的表达式过于复杂的情况.把转台的判断逻辑转移到标识不用状态的一系列类中(或者方法中),
可以吧复杂的判断逻辑简化,
注:如果这个判断逻辑很简单,那么就没有必要使用状态模式了!!!
"""from abc import *
import collections  # 有序字典class Context:def __init__(self):self.hour = 9self.curr = ConcreteStateA()@propertydef state(self):return self.state@state.setterdef set_state(self, s):self.curr = sdef Request(self):self.curr.Handel(self)class State:__metaclass__ = ABCMetadef __init__(self):pass@abstractmethoddef Handel(self, context): passclass ConcreteStateA(State):def Handel(self, context):print "这里是状态A"context.curr = ConcreteStateB()context.hour = 12class ConcreteStateB(State):def Handel(self, context):print "这里是状态B"context.curr = ConcreteStateA()context.hour = 21if __name__ == '__main__':context = Context()context.hour = 9context.Request()context.Request()context.Request()print context.hour# d1 = {}# d1 = collections.OrderedDict()  # 将普通字典转换为有序字典# d1['a'] = 'A'# d1['b'] = 'B'# d1['c'] = 'C'# d1['d'] = 'D'# for k, v in d1.items():#     # print k, v#     pass## d2 = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}# for k, v in d2.items():#     print k, v
#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : cp4.py
# @Software: PyCharm# !/usr/bin/env python
# -*- coding:utf-8 -*-__author__ = 'Andy'
"""
大话设计模式
设计模式——状态模式
状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
(当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变他的行为)
"""class State(object):def __init__(self):passdef write_program(self, w):passclass Work(object):def __init__(self):self.hour = 9self.curr = ForenoonState()def set_state(self, s):self.curr = sdef write_program(self):self.curr.write_program(self)class ForenoonState(State):def write_program(self, w):if w.hour < 12:print "当前时间:%s点," % w.hour, "精神百倍"else:w.set_state(AfternoonState())w.write_program()class AfternoonState(State):def write_program(self, w):if w.hour < 17:print "当前时间:%s点," % w.hour, "状态还行,继续努力"else:w.set_state(EveningState())w.write_program()class EveningState(State):def write_program(self, w):if w.hour < 21:print "当前时间:%s点," % w.hour, "加班呢,疲劳了"else:w.set_state(SleepState())w.write_program()class SleepState(State):def write_program(self, w):print "当前时间:%s点," % w.hour, "不行了,睡着了"if __name__ == "__main__":work = Work()work.hour = 9work.write_program()# work.hour = 15# work.write_program()# work.hour = 20# work.write_program()# work.hour = 22# work.write_program()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LED显示屏的点间距越小越好吗

引言 在LED显示屏市场日趋成熟的同时&#xff0c;小间距显示屏成为了许多用户的首选。然而&#xff0c;点间距真的是越小越好吗&#xff1f;本文将探讨这一问题&#xff0c;并提供全面的选购指南。 点间距&#xff1a;并非越小越好 小间距显示屏因其精细的显示效果而备受青睐。…

剪辑如何剪辑制作视频短视频剪辑学习怎么学,难吗?

工欲善其事必先利其器&#xff0c;有一个好的工具能让你的工作如鱼得水&#xff0c;果你想在短视频中制作精良的视频&#xff0c;你就考虑电脑制作软件了。果你想制作精良的视频&#xff0c;你就考虑电脑制作软件了。 如何找到剪辑软件了&#xff1f;你可以直接去软件的官方。你…

KT6368A-sop8蓝牙主机芯片获取电动车胎压传感器数据功能

KT6368A蓝牙芯片新增主机模式&#xff0c;扫描周边的胎压传感器&#xff0c;这里扮演的角色就是观察者。因为测试胎压传感器&#xff0c;发现它的广播模式可发现&#xff0c;不可连接 胎压传感器部分的手册说明如下&#xff0c;关于蓝牙部分的协议 实际蓝牙芯片收到的数据&…

国密算法SM1 SM2 SM3 SM4 SM9

一、概述 SM1-无具体实现 SM1作为一种对称加密算法&#xff0c;由于其算法细节并未公开&#xff0c;且主要在中国国内使用&#xff0c;因此在国际通用的加密库&#xff08;如Bouncy Castle&#xff09;中并不直接支持SM1算法。 SM1算法的具体实现涉及国家密码管理局的规范&…

Studying-代码随想录训练营day20| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

第二十天&#xff0c;二叉树part07&#xff0c;二叉树搜索树加油加油&#x1f4aa; 目录 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 拓展&#xff1a;普通二叉树的删除方式 总结 235.二叉搜索树的最近公共祖先 文档讲解&…

洁净室(区)浮游菌检测标准操作规程及GB/T 16292-2010测试方法解读

洁净室(区)空气中浮游菌的检测。洁净区浮游菌检测是一种评估和控制洁净区(如实验室、生产车间等)内空气质量的方法。这种检测的目的是通过测量空气中的微生物(即浮游菌)数量&#xff0c;来评估洁净区的清洁度或污染程度。下面中邦兴业小编带大家详细看下如何进行浮游菌采样检测…

RK3568技术笔记九 编译Linux详细介绍

在编译前需要按照前面的方法始化编译环境&#xff0c;否则会导致编译失败&#xff08;若配置过则无需重复配置&#xff09;。 全自动编译包含所有镜像编译&#xff0c;包括&#xff1a;uboot编译、Kernel编译、Recovey编译、文件系统编译、编译完成镜像的更新与打包。 按照前面…

阅读笔记——《Large Language Model guided Protocol Fuzzing》

【参考文献】Meng R, Mirchev M, Bhme M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium (NDSS). 2024.&#xff08;CCF A类会议&#xff09;【注】本文仅为作者个人学习笔记&a…

【附精彩文章合辑】当谈到程序的“通用性”与“过度设计”的困境时,我们可以通过一些具体的例子来更直观地阐述这些解决方案

当谈到程序的“通用性”与“过度设计”的困境时&#xff0c;我们可以通过一些具体的例子来更直观地阐述这些解决方案。以下是一些示例&#xff1a; 一、明确需求与目标 例子1&#xff1a;在线购物平台 需求分析&#xff1a;平台需要支持用户注册、登录、浏览商品、下单购买、…

2024ciscn 华东北awdp pwn部分wp

pwn1 break 很简单&#xff0c;栈可执行。 先格式化字符串泄露出栈地址和canary&#xff0c;然后稍稍布置一下打orw就行 沙盒和没有一样 from pwn import *context(archamd64, oslinux)if __name__ __main__:# io remote(192.47.1.39, 80)io remote(192.168.142.137, 123…

初阶 《操作符详解》 10. 逗号表达式

10. 逗号表达式 exp1, exp2, exp3, …expN 注&#xff1a; 1.逗号表达式&#xff0c;就是用逗号隔开的多个表达式 2.逗号表达式&#xff0c;从左向右依次执行&#xff0c;整个表达式的结果是最后一个表达式的结果 代码1 #include <stdio.h> int main() {int a 1;int b…

【Qt6.3 基础教程 19】 设计直观用户界面(UI):Qt应用界面设计原则

文章目录 前言理解用户需求界面的简洁性一致性反馈利用布局管理美化你的应用结论 前言 用户界面(UI)设计对于任何软件项目的成功至关重要&#xff0c;因为它是用户与您的应用之间交流的桥梁。在Qt环境中&#xff0c;拥有一套清晰和直观的UI设计原则&#xff0c;将有助于您创建…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单&#xff0c;ubuntu18.04太老了&#xff0c;官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用&#xff0c;于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成&#xff0c;…

golang 获取字符串切割之后的最后一个字符串

有些场景需要获取字符串按某个字符切割之后&#xff0c;获取最后&#xff0c;有个比较好的实践分享 strings.LastIndex 如果没有匹配到&#xff0c;则返回-1 package mainimport ("fmt""strings" )func main() {ss : []string{"", ":&quo…

数据结构需要每个都具体实现吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;用c的stl能刷算法题是不…

【INTEL(ALTERA)】运行配置找不到导入的自定义 makefile 项目

目录 说明 解决方法 说明 在使用 Import Custom Makefile 用于Nios II软件构建工具项目 选项导入项目后&#xff0c;Nios II SBT 无法将导入的自定义 makefile 识别为Nios II C/C 应用项目。因此&#xff0c;项目名称不出现在运行配置中的列表中。 解决方法 在 "运行配置 …

clean code-代码整洁之道 阅读笔记(第十三章)

第十三章 并发编程 "对象是过程的抽象。线程是调度的抽象。" --James O Coplien 13.1 为什么要并发 并发是一种解耦策略。它帮助我们把做什么&#xff08;目的&#xff09;和何时&#xff08;时机&#xff09;做分解开。在单线 程应用中&#xff0c;目的与时机紧密耦…

【OpenCV 图像处理 Python版】OpenCV 简介及安装

文章目录 1.OpenCV 介绍1.1 OpenCV 的特点1.2 OpenCV 的主要模块1.3 OpenCV 的应用场景 2.OpenCV-Python 库3.OpenCV 安装 1.OpenCV 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它由英特尔公司于1999年…

API的优势及应用场景(淘宝API测试的详细步骤)

一、API的优势 API的出现为应用程序间的通信提供了一种新的方式&#xff0c;它有以下优势&#xff1a; 1、降低开发难度 开发者可以通过API访问其他应用程序的数据和功能&#xff0c;避免了重复开发&#xff0c;降低了开发难度。 2、提高开发效率 API提供了一种标准化的通…

Transformer 模型全解析:NLP领域的变革者与任务精粹

标题&#xff1a;Transformer 模型全解析&#xff1a;NLP领域的变革者与任务精粹 引言 Transformer 模型自问世以来&#xff0c;已成为自然语言处理&#xff08;NLP&#xff09;领域的一大突破&#xff0c;其基于自注意力机制的架构为各种语言任务带来了革命性的进展。本文将…