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 import用法以及与from...import的区别
May 28 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 Python
python 堆和优先队列的使用详解
Mar 05 Python
记录Python脚本的运行日志的方法
Jun 05 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
Python自动登录QQ的实现示例
Aug 28 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 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
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
Python中splitlines()方法的使用简介
2015/05/20 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
幼儿园元旦家长感言
2014/02/27 职场文书
保护环境倡议书500字
2014/05/19 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
Ajax实现异步加载数据
2021/11/17 Javascript