状态模式(python)

原创 2011年10月19日 10:58:56

状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
应用场景:一个对象的行为取决于它的状态,即它必须在运行时刻根据状态改变它的行为。如果控制状态转换的条件表达式过于复杂,就可以考虑使用状态模式。
关键点:把状态的判断逻辑转移到表示不同状态的一系列类当中,这样就可以简化复杂的逻辑判断了。
优点:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

#encoding=utf-8
#
#by panda
#状态模式


def printInfo(info):
    print unicode(info, 'utf-8').encode('gbk')

#State:上班状态基类
class State():
    def WriteProgram():
        pass

#上午工作状态类
class ForenoonState(State):
    def WriteProgram(self,w):
        if (w.Hour < 12):
            printInfo("当前时间:%d点 工作状态:上午工作,精神百倍" % w.Hour)
        else:
            w.SetState(noonState())
            w.WriteProgram()            

#中午工作状态类
class noonState(State):
    def WriteProgram(self,w):
        if (w.Hour < 13):
            printInfo("当前时间:%d点 午饭;午休" % w.Hour)
        else:
            w.SetState(AfternoonState())
            w.WriteProgram();
            
#下午工作状态类
class AfternoonState(State):
    def WriteProgram(self,w):
        if (w.Hour < 18):
            printInfo("当前时间:%d点 下午状态还不错,继续努力" % w.Hour)
        else:
            w.SetState(EveningState())
            w.WriteProgram();

#晚上工作状态类
class EveningState(State):
    def WriteProgram(self,w):
        if(w.TaskFinished):
            w.SetState(RestState())
            w.WriteProgram()
            return
            
        if (w.Hour < 21):
            printInfo("当前时间:%d点 加班哦,好累!" % w.Hour)
        else:
            w.SetState(SleepingState())
            w.WriteProgram();

#睡眠状态
class SleepingState(State):
    def WriteProgram(self,w):
        printInfo("当前时间:%d点 睡觉了" % w.Hour)


#下班工作状态
class RestState(State):
    def WriteProgram(self,w):
        printInfo("当前时间:%d点 下班回家了" % w.Hour)
            

#Context:上班
class Work():
    state = ForenoonState();
    TaskFinished = False
    Hour = 8.0
    
    def SetState(self, state):
        self.state = state
        
    def WriteProgram(self):
        self.state.WriteProgram(self)


def clientUI():
    work = Work()    
    for i in range(9,23,1):
        work.Hour = i
        if(i > 19):
            work.TaskFinished = True
        work.WriteProgram()
    return

if __name__ == '__main__':
    clientUI();

类图


23种设计模式之python实现--State模式

#理解 #事物往往有多种状态,对于每一种状态,响应同一种输入的反应不同,最典型的是有限状态机 #与策略模式不同的是State模式关注的是状态,将每一种状态封装,简化复杂的switch或驱动表对状态机的...
  • apple_boys
  • apple_boys
  • 2014-04-18 10:40:43
  • 687

建议53:用状态模式美化代码,关于python-state工具包的理解

在《编写高质量代码:改善python程序的91个建议》的建议53:用状态模式美化代码小节中,介绍了状态模式如下:就是当一个对象的内在状态改变时,允许改变其行为,但这个对象看起来像是改变了其类。   ...
  • wxx634897019
  • wxx634897019
  • 2015-12-22 18:17:22
  • 1962

状态模式(python)

""" 状态模式 一个复杂对象改变它的内在状态则允许改变它的行为 应用场景:一个复杂对象包含有很多个分支,则把这些分支抽象成一个个子类,该对象只需要去调用子类的公共接口。客户端调用时,可以 根据状态来...
  • a23764996
  • a23764996
  • 2017-01-12 08:53:30
  • 423

设计模式_状态模式

一、单例模式简介         例模式是在开发中用的最多的一种设计模式,那为什么会有单例设计模式呢?         单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容...
  • Two_Water
  • Two_Water
  • 2016-07-02 21:38:06
  • 3080

状态模式

状态模式
  • qq_17727449
  • qq_17727449
  • 2016-09-24 22:17:23
  • 166

状态模式(python)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 应用场景:一个对象的行为取决于它的状态,即它必须在运行时刻根据状态改变它的行为。如果控制状态转换的条件表达式过于复...
  • ponder008
  • ponder008
  • 2011-10-19 10:58:56
  • 2219

__getstate__ 与 __setstate__的作用

一些对象类型(譬如,文件对象)不能进行 pickle。处理这种不能 pickle 的对象的实例属性时可以使用特殊的方法( _getstate_() 和 _setstate_() )来修改类实例的状态。...
  • shuimuniao
  • shuimuniao
  • 2012-11-23 14:47:27
  • 6357

React-Native 基础(三) 使用State改变状态

参考文档: http://reactnative.cn/docs/next/state.html#content http://reactnative.cn/docs/next/state.htm...
  • KevinsCSDN
  • KevinsCSDN
  • 2016-07-29 10:27:45
  • 5089

Python设计模式(三)【共享模式】

又来干货,继续努力,少年!# 共享模式 class Borg: """共享状态""" __shared_state = {} def __init__(self): ...
  • WuLex
  • WuLex
  • 2016-08-25 14:45:20
  • 2824
收藏助手
不良信息举报
您举报文章:状态模式(python)
举报原因:
原因补充:

(最多只允许输入30个字)