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、在狀態比較多時,子類也會非常多,不便於管理。