状态模式(python)


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

类图:
\

摘自:ponder008的专栏

相关内容

    暂无相关文章

评论关闭