状态模式(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();

类图


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值