Python设计模式-状态模式
代码基于3.5.2,代码如下;
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、在状态比较多时,子类也会非常多,不便于管理。