Python设计模式-状态模式

代码基于3.5.2,代码如下;

#coding:utf-8
#状态模式class state():def writeProgram(self,work):raise NotImplementedErrorclass forenoonState(state):def writeProgram(self,work):if work.isFinished:restState().writeProgram(work)else:if work.hour < 12 and work.hour >= 7:                             print("当前时间 : {0}点,上午工作时间,有精神".format(work.hour))    elif work.hour < 7:                                               sleepingState().writeProgram(work)                            else:noonState().writeProgram(work)class noonState(state):def writeProgram(self,work):if work.isFinished:restState().writeProgram(work)else:if work.hour < 13:print("当前时间 : {0}点,中午工作时间,有精神".format(work.hour))else:afternoonState().writeProgram(work)class afternoonState(state):def writeProgram(self,work):if work.isFinished:restState().writeProgram(work)else:if work.hour < 17:print("当前时间 : {0}点,下午工作时间,有精神".format(work.hour))else:eveningState().writeProgram(work)class eveningState(state):def writeProgram(self,work):if work.isFinished:restState().writeProgram(work)else:if work.hour < 21:print("当前时间 : {0}点,晚上工作时间,有精神".format(work.hour))else:sleepingState().writeProgram(work)class sleepingState(state):def writeProgram(self,work):print("当前时间 : {0}点,晚上睡觉时间,有精神".format(work.hour))class restState(state):def writeProgram(self,work):print("当前时间 : {0}点,工作已经完成下班休息".format(work.hour))class work():def __init__(self):self.current = forenoonState()self.isFinished = Falseself.hour = 0def setFinished(self,flag):self.isFinished = flagdef writeProgram(self):self.current.writeProgram(self)if __name__ == "__main__":project = work()project.hour = 9project.writeProgram()project.hour = 5project.writeProgram()project.hour = 10project.writeProgram()project.hour = 12project.writeProgram()project.hour = 13project.writeProgram()project.hour = 14project.writeProgram()project.hour = 17project.writeProgram()project.setFinished(True)project.hour = 19project.writeProgram()project.hour = 22project.writeProgram()

状态模式分析与解读

状态模式

状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

代码解读

该例子基于的需求:当工作的时间改变时,来显示不同的工作状态。
1、先定义了state类,以下的工作状态类都是由该类继承而来,并实现writeProgram()方法;
2、先后定义了forenoonState、noonState、afternoonState、eveningState、sleepingState和restState状态类,其中在实现每个writeProgram方法时,先判断工作是否已经完成,如果完成直接调用restState的writeProgram方法,如果当前类不能处理该请求,则接着往下个实例进行传递,如当工作未完成时,在forenoonState类中,如果超过了12点,则新建noonState类并调用该类的writeProgram方法处理,依次往下传递指导处理完成为止。

代码运行结果如下:

当前时间 : 9点,上午工作时间,有精神
当前时间 : 5点,中午工作时间,有精神
当前时间 : 10点,上午工作时间,有精神
当前时间 : 12点,中午工作时间,有精神
当前时间 : 13点,下午工作时间,有精神
当前时间 : 14点,下午工作时间,有精神
当前时间 : 17点,晚上工作时间,有精神
当前时间 : 19点,工作已经完成下班休息
当前时间 : 22点,工作已经完成下班休息

状态模式应用场景:

1、行为状态改变的场景。这点在各种控制器中非常常见,同时,逻辑结构为状态转移图的场景中都非常适用。

优缺点分析

优点

1、结构清晰,相比if ..else...简约不少;
2、封装性好,外部调用不必知道内部实现细节。

缺点

1、在状态比较多时,子类也会非常多,不便于管理。

Python设计模式-状态模式相关推荐

  1. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  2. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  3. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  4. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  5. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  6. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  7. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  8. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

  9. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

最新文章

  1. 【业界】开源大势降低技术门槛,人工智能企业更依赖大数据
  2. 【转】为什么要写技术博
  3. 一篇文章讲清楚人工智能、机器学习和深度学习的区别和联系
  4. Cocos Creator实现的《点我+1》
  5. 06 | 全局锁和表锁 : 给表加个字段怎么有这么多阻碍
  6. (一) shario教程资料
  7. 基础篇--Java IO--概览
  8. jfinal启动正常,但是报错:oejw.WebAppContext:Failed startup
  9. 用Windows Live Writer客户端写51CTO博客
  10. android studio找不到r文件,Apk 中找不到r类文件
  11. Python写数据结构:二叉树的创建和遍历
  12. 笔记︱金融风险之欺诈分类以及银行防控体系简述
  13. RH4 构建ORACLE ASM
  14. Axure安装、破解、汉化一条龙
  15. 最新触摸精灵开发教程(价值300
  16. NOI / 2.1基本算法之枚举 1809:两倍
  17. 《迷途深渊》隐私声明
  18. LoadRunner性能测试实战教程
  19. 二十几岁的女孩应该知道(值得一看)
  20. 【自学Python】Python布尔型(bool)

热门文章

  1. 第五届中国企业服务年会:洞见2022数智化的“光与火”
  2. Golang+Python 实现安全动态开机密码+服务器存储
  3. 哪家互联网公司涨薪最厉害?居然不是阿里腾讯
  4. Facebook面经全披露,我是怎么拿到机器学习工程师offer的?
  5. 解读 | 2019年10篇计算机视觉精选论文(中)
  6. T5,一个探索迁移学习边界的模型
  7. 400名微软员工主动曝光薪资:28万元到228万元不等!
  8. “不给钱就删库”的勒索病毒, 程序员该如何防护?
  9. 数据科学家需要知道的5种图算法
  10. AI一分钟 | 黎曼猜想已被证明?对错有待同行评议;讯飞与发帖质疑同传译员达成谅解...