Python设计模式之状态模式原理与用法详解


Posted in Python onJanuary 15, 2019

本文实例讲述了Python设计模式之状态模式原理与用法。分享给大家供大家参考,具体如下:

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

下面是一个状态模式的demo:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Andy'
"""
大话设计模式
设计模式——状态模式
状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
(当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变他的行为)
"""
class State(object):
  def __init__(self):
    pass
  def write_program(self, w):
    pass
class Work(object):
  def __init__(self):
    self.hour = 9
    self.curr = ForenoonState()
  def set_state(self, s):
    self.curr = s
  def 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 = 9
  work.write_program()
  work.hour = 15
  work.write_program()
  work.hour = 20
  work.write_program()
  work.hour = 22
  work.write_program()

运行结果:

当前时间:9点, 精神百倍
当前时间:15点, 状态还行,继续努力
当前时间:20点, 加班呢,疲劳了
当前时间:22点, 不行了,睡着了

上面类的设计如下图:

Python设计模式之状态模式原理与用法详解

应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化

(当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变他的行为)

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python生成指定尺寸缩略图的示例
May 07 Python
VSCode下好用的Python插件及配置
Apr 06 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
python实现抖音点赞功能
Apr 07 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
opencv实现简单人脸识别
Feb 19 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 #Python
Python设计模式之备忘录模式原理与用法详解
Jan 15 #Python
matplotlib.pyplot绘图显示控制方法
Jan 15 #Python
python实现彩色图转换成灰度图
Jan 15 #Python
Python中new方法的详解
Jan 15 #Python
Python之循环结构
Jan 15 #Python
python实现图片彩色转化为素描
Jan 15 #Python
You might like
PHP - Html Transfer Code
2006/10/09 PHP
我的论坛源代码(四)
2006/10/09 PHP
php 高效率写法 推荐
2010/02/21 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
JS 自动完成 AutoComplete(Ajax 查询)
2009/07/07 Javascript
JSQL  一个 web DB 的封装
2010/05/05 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
Python编程中NotImplementedError的使用方法
2018/04/21 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
面包店的创业计划书范文
2014/01/16 职场文书
运动会入场词60字
2014/02/15 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
英文请假条
2014/04/11 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书