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与Java间Socket通信实例代码
Mar 06 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
Django 缓存配置Redis使用详解
Jul 23 Python
python requests使用socks5的例子
Jul 25 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
Oct 12 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
Python写捕鱼达人的游戏实现
Mar 31 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 Python
Python实现ElGamal加密算法的示例代码
Jun 19 Python
使用python创建股票的时间序列可视化分析
Mar 03 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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
php生成微信红包数组的方法
2019/09/05 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
javascript编写实用的省市选择器
2015/02/12 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
面试必备的求职信
2014/05/25 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
规范化管理年活动总结
2014/08/29 职场文书
公司员工奖惩制度
2015/08/04 职场文书
中学生运动会广播稿
2015/08/19 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫