状态模式(python)

来源:互联网 发布:为什么淘宝上苏宁易购 编辑:程序博客网 时间:2024/06/18 13:15

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

#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()    returnif __name__ == '__main__':    clientUI();

类图