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 22 Python
Python中lambda的用法及其与def的区别解析
Jul 28 Python
用Python程序抓取网页的HTML信息的一个小实例
May 02 Python
python版本的读写锁操作方法
Apr 25 Python
浅谈python字典多键值及重复键值的使用
Nov 04 Python
python开发利器之ulipad的使用实践
Mar 16 Python
Python内建模块struct实例详解
Feb 02 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
Python单例模式的四种创建方式实例解析
Mar 04 Python
Django Xadmin多对多字段过滤实例
Apr 07 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
想学画画?python满足你!
Dec 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
Function.prototype.bind用法示例
2013/09/16 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
详解Vue 动态添加模板的几种方法
2017/04/25 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
Python解析最简单的验证码
2016/01/07 Python
Python实现的堆排序算法示例
2018/04/29 Python
python读写LMDB文件的方法
2018/07/02 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
现金会计岗位职责
2013/12/05 职场文书
工作的心得体会
2013/12/31 职场文书
党员公开承诺事项
2014/03/25 职场文书
文明城市创建标语
2014/06/16 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
苏州园林导游词
2015/02/03 职场文书
三下乡个人总结
2015/03/04 职场文书
会计出纳岗位职责
2015/03/31 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
Go获取两个时区的时间差
2022/04/20 Golang