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 相关文章推荐
go语言计算两个时间的时间差方法
Mar 13 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
Python安装pycurl失败的解决方法
Oct 15 Python
python实现随机漫步方法和原理
Jun 10 Python
numpy np.newaxis 的实用分享
Nov 30 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
PyCharm Community安装与配置的详细教程
Nov 24 Python
使用scrapy实现增量式爬取方式
Jun 21 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类常量的使用详解
2013/06/08 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
Python中使用不同编码读写txt文件详解
2015/05/28 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
Python模拟登陆实现代码
2017/06/14 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
python队列queue模块详解
2018/04/27 Python
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
中文教师求职信
2014/02/22 职场文书
学习雷锋标语
2014/06/25 职场文书
写得不错的求职信范文
2014/07/11 职场文书
家庭困难证明
2014/10/12 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
辞职信标准格式
2015/02/27 职场文书