代码成就万世基积沙镇海,梦想永在凌云意意气风发。

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、在状态比较多时,子类也会非常多,不便于管理。
posted @ 2017-12-02 16:24  Tomorrow1  阅读(157)  评论(0)    收藏  举报