Python设计模式-状态模式

来源:互联网 发布:网络客服招聘 编辑:程序博客网 时间:2024/06/09 22:56

Python设计模式-状态模式

代码基于3.5.2,代码如下;

#coding:utf-8#状态模式class state():    def writeProgram(self,work):        raise NotImplementedErrorclass 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、在状态比较多时,子类也会非常多,不便于管理。
原创粉丝点击