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使用pandas实现数据分割实例代码
Jan 25 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
python画双y轴图像的示例代码
Jul 07 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
python爬虫工具例举说明
Nov 30 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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 curl模拟post提交数据示例
2013/12/31 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
python基础教程之分支、循环简单用法
2016/06/16 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
人事助理自荐信
2014/02/02 职场文书
《识字五》教学反思
2014/03/01 职场文书
应届毕业生求职信
2014/05/26 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
委托书格式范文
2015/01/28 职场文书
婚宴新郎致辞
2015/07/28 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android