Python设计模式-状态模式

Python设计模式-状态模式

代码基于3.5.2,代码如下;
#coding:utf-8
#状态模式

class state():
    def writeProgram(self,work):
        raise NotImplementedError

class forenoonState(state):
    def writeProgram(self,work):
        if work.isFinished:
            restState().writeProgram(work)
        else:
            if work.hour < 12 and work.hour >= 7:                             
                print("当前时间 : {0}点,上午工作时间,有精神".format(work.hour))    
            elif work.hour < 7:                                               
                sleepingState().writeProgram(work)                            
            else:
                noonState().writeProgram(work)

class noonState(state):
    def writeProgram(self,work):
        if work.isFinished:
            restState().writeProgram(work)
        else:
            if work.hour < 13:
                print("当前时间 : {0}点,中午工作时间,有精神".format(work.hour))
            else:
                afternoonState().writeProgram(work)

class afternoonState(state):
    def writeProgram(self,work):
        if work.isFinished:
            restState().writeProgram(work)
        else:
            if work.hour < 17:
                print("当前时间 : {0}点,下午工作时间,有精神".format(work.hour))
            else:
                eveningState().writeProgram(work)

class eveningState(state):
    def writeProgram(self,work):
        if work.isFinished:
            restState().writeProgram(work)
        else:
            if work.hour < 21:
                print("当前时间 : {0}点,晚上工作时间,有精神".format(work.hour))
            else:
                sleepingState().writeProgram(work)

class sleepingState(state):
    def writeProgram(self,work):
        print("当前时间 : {0}点,晚上睡觉时间,有精神".format(work.hour))

class restState(state):
    def writeProgram(self,work):
        print("当前时间 : {0}点,工作已经完成下班休息".format(work.hour))

class work():
    def __init__(self):
        self.current = forenoonState()
        self.isFinished = False
        self.hour = 0
    def setFinished(self,flag):
        self.isFinished = flag
    def writeProgram(self):
        self.current.writeProgram(self)

if __name__ == "__main__":
    project = work()
    project.hour = 9
    project.writeProgram()
    project.hour = 5
    project.writeProgram()
    project.hour = 10
    project.writeProgram()
    project.hour = 12
    project.writeProgram()
    project.hour = 13
    project.writeProgram()
    project.hour = 14
    project.writeProgram()
    project.hour = 17
    project.writeProgram()

    project.setFinished(True)
    project.hour = 19
    project.writeProgram()
    project.hour = 22
    project.writeProgram()

状态模式分析与解读

状态模式

状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

代码解读

该例子基于的需求:当工作的时间改变时,来显示不同的工作状态。
1、先定义了state类,以下的工作状态类都是由该类继承而来,并实现writeProgram()方法;
2、先后定义了forenoonState、noonState、afternoonState、eveningState、sleepingState和restState状态类,其中在实现每个writeProgram方法时,先判断工作是否已经完成,如果完成直接调用restState的writeProgram方法,如果当前类不能处理该请求,则接着往下个实例进行传递,如当工作未完成时,在forenoonState类中,如果超过了12点,则新建noonState类并调用该类的writeProgram方法处理,依次往下传递指导处理完成为止。

代码运行结果如下:

当前时间 : 9点,上午工作时间,有精神
当前时间 : 5点,中午工作时间,有精神
当前时间 : 10点,上午工作时间,有精神
当前时间 : 12点,中午工作时间,有精神
当前时间 : 13点,下午工作时间,有精神
当前时间 : 14点,下午工作时间,有精神
当前时间 : 17点,晚上工作时间,有精神
当前时间 : 19点,工作已经完成下班休息
当前时间 : 22点,工作已经完成下班休息

状态模式应用场景:

1、行为状态改变的场景。这点在各种控制器中非常常见,同时,逻辑结构为状态转移图的场景中都非常适用。

优缺点分析

优点
1、结构清晰,相比if ..else...简约不少;
2、封装性好,外部调用不必知道内部实现细节。
缺点
1、在状态比较多时,子类也会非常多,不便于管理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值