Python设计模式-状态模式
Python设计模式-状态模式
代码基于3.5.2,代码如下;
1 #coding:utf-8 2 #状态模式 3 4 class state(): 5 def writeProgram(self,work): 6 raise NotImplementedError 7 8 class forenoonState(state): 9 def writeProgram(self,work): 10 if work.isFinished: 11 restState().writeProgram(work) 12 else: 13 if work.hour < 12 and work.hour >= 7: 14 print("当前时间 : {0}点,上午工作时间,有精神".format(work.hour)) 15 elif work.hour < 7: 16 sleepingState().writeProgram(work) 17 else: 18 noonState().writeProgram(work) 19 20 class noonState(state): 21 def writeProgram(self,work): 22 if work.isFinished: 23 restState().writeProgram(work) 24 else: 25 if work.hour < 13: 26 print("当前时间 : {0}点,中午工作时间,有精神".format(work.hour)) 27 else: 28 afternoonState().writeProgram(work) 29 30 class afternoonState(state): 31 def writeProgram(self,work): 32 if work.isFinished: 33 restState().writeProgram(work) 34 else: 35 if work.hour < 17: 36 print("当前时间 : {0}点,下午工作时间,有精神".format(work.hour)) 37 else: 38 eveningState().writeProgram(work) 39 40 class eveningState(state): 41 def writeProgram(self,work): 42 if work.isFinished: 43 restState().writeProgram(work) 44 else: 45 if work.hour < 21: 46 print("当前时间 : {0}点,晚上工作时间,有精神".format(work.hour)) 47 else: 48 sleepingState().writeProgram(work) 49 50 class sleepingState(state): 51 def writeProgram(self,work): 52 print("当前时间 : {0}点,晚上睡觉时间,有精神".format(work.hour)) 53 54 class restState(state): 55 def writeProgram(self,work): 56 print("当前时间 : {0}点,工作已经完成下班休息".format(work.hour)) 57 58 class work(): 59 def __init__(self): 60 self.current = forenoonState() 61 self.isFinished = False 62 self.hour = 0 63 def setFinished(self,flag): 64 self.isFinished = flag 65 def writeProgram(self): 66 self.current.writeProgram(self) 67 68 if __name__ == "__main__": 69 project = work() 70 project.hour = 9 71 project.writeProgram() 72 project.hour = 5 73 project.writeProgram() 74 project.hour = 10 75 project.writeProgram() 76 project.hour = 12 77 project.writeProgram() 78 project.hour = 13 79 project.writeProgram() 80 project.hour = 14 81 project.writeProgram() 82 project.hour = 17 83 project.writeProgram() 84 85 project.setFinished(True) 86 project.hour = 19 87 project.writeProgram() 88 project.hour = 22 89 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、在状态比较多时,子类也会非常多,不便于管理。
版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
https://www.cnblogs.com/qq_841161825/

浙公网安备 33010602011771号