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 05 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
深入浅析python 协程与go协程的区别
May 09 Python
python3.8下载及安装步骤详解
Jan 15 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
python selenium xpath定位操作
Sep 01 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 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中10个不常见却非常有用的函数
2010/03/21 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
PHP+jQuery+Ajax实现多图片上传效果
2015/03/14 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
pandas重新生成索引的方法
2018/11/06 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
班级聚会策划书
2014/01/16 职场文书
群众路线批评与自我批评
2014/02/06 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
CentOS MySql8 远程连接实战
2022/04/19 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL