本文实例讲述了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 Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

本文标题: Python设计模式之状态模式原理与用法详解

本文地址: http://www.cppcns.com/jiaoben/python/249939.html

python的编程模式-Python设计模式之状态模式原理与用法详解相关推荐

  1. python字符串strip的作用_Python字符串函数strip()原理及用法详解

    Python字符串函数strip()原理及用法详解 strip:用于移除字符串头尾指定的字符(默认为空格)或字符序列.注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法:str.s ...

  2. Python多线程编程(一):threading 模块 Thread 类的用法详解

    我们进行程序开发的时候,肯定避免不了要处理并发的情况. 一般并发的手段有采用多进程和多线程. 但线程比进程更轻量化,系统开销一般也更低,所以大家更倾向于用多线程的方式处理并发的情况. Python 提 ...

  3. java 中适配器原理_Java经典设计模式中关于适配器模式原理以及用法详解

    这篇文章主要介绍了Java经典设计模式之适配器模式,简单说明了适配器模式的概念.原理,并结合实例形式分析了java适配器模式的用法与相关注意事项,需要的朋友可以参考下 本文实例讲述了Java经典设计模 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. python的out模式_Python设计模式之状态模式

    状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态机?状态机是一个抽象机 ...

  6. python中index什么意思_Python中index()和seek()的用法(详解)

    1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l ...

  7. python中values是什么意思_Python values()与itervalues()的用法详解

    dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value: d = { 'Adam': 95, 'Li ...

  8. python for i in range(len())_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  9. python 内存分析工具_python内存监控工具memory_profiler和guppy的用法详解

    python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大.我 ...

最新文章

  1. R语言可视化散点图、气泡图、动态气泡图、数据点重合的散点图、数据点计数图、抖动数据点图、基于lm方法或者loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注
  2. 快速撑握C#知识点系列之(struct)结构
  3. 第十届蓝桥杯省赛JavaC组真题——详细答案对照(完整版-包含打扫机器人的视频全过程讲解与编码内容对照)
  4. Quartus prime16.0 与modelsim ae 联调
  5. lightoj1027(期望dp)
  6. 微信亿级用户异常检测框架的设计与实践
  7. Linux 下的终端
  8. 通过AMS分析Binder流程(Java到Kernel)
  9. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_2_Junit_测试概述...
  10. win10运行Flink
  11. 真假马云Deciphering Jack Ma
  12. zblog asp 升级到PHP,Zblog之php版本 千呼万唤始出来
  13. 快速生产地图瓦片解决方案:多任务切图
  14. (十二)系统集成中级-质量管理
  15. 基于JAVA微博网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  16. 在ubuntu 上搭建Nginx-RTMP 直播服务器
  17. Kubernetes: kubectl 插件管理器 Krew 安装
  18. 归并排序---天下大事,合久必分,分久必合
  19. 科技生活,舒适优雅,21款奔驰GLE350e改ACC、电吸门、通风座椅
  20. (轉貼) 如何重新定義Thinkvantage(AccessIBM)按鍵的功能? (NB) (ThinkPad) (OS) (Windows)

热门文章

  1. mysql 的S 锁和X锁的区别
  2. BZOJ1008[HNOI2008]越狱
  3. centos安装时各个版本的含义
  4. 【转载】探寻C++最快的读取文件的方案
  5. 谈谈C++继承中的重载,覆盖和隐藏
  6. VSFTP用户目录指定
  7. 可遇不可求的BUG之采用MYSQL odbc 3.51访问数据库返回值缺失
  8. 本周技术主题-----.net中的资源文件
  9. 洛谷P1424小鱼的航程改进版
  10. hdu3001(三进制状压)