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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
Python实现购物程序思路及代码
Jul 24 Python
python监控文件并且发送告警邮件
Jun 21 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
pandas实现将日期转换成timestamp
Dec 07 Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 Python
python 实现aes256加密
Nov 27 Python
pandas map(),apply(),applymap()区别解析
Feb 24 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迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
Python实现分割文件及合并文件的方法
2015/07/10 Python
python动态加载包的方法小结
2016/04/18 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
python 获取图片分辨率的方法
2019/01/08 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
英国著名书店:Foyles
2018/12/01 全球购物
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
编辑个人求职信范文
2013/09/21 职场文书
应届护士求职信范文
2014/01/26 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
人事局接收函
2015/01/30 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP