狀態模式:當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
應用情境:一個對象的行為取決於它的狀態,即它必須在運行時刻根據狀態改變它的行為。如果控制狀態轉換的條件運算式過於複雜,就可以考慮使用狀態模式。
關鍵點:把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,這樣就可以簡化複雜的邏輯判斷了。
優點:將與特定狀態相關的行為局部化,並且將不同狀態的行為分割開來。
#encoding=utf-8##by panda#狀態模式def printInfo(info): print unicode(info, 'utf-8').encode('gbk')#State:上班狀態基類class State(): def WriteProgram(): pass#上午工作狀態類class ForenoonState(State): def WriteProgram(self,w): if (w.Hour < 12): printInfo("目前時間:%d點 工作狀態:上午工作,精神百倍" % w.Hour) else: w.SetState(noonState()) w.WriteProgram() #中午工作狀態類class noonState(State): def WriteProgram(self,w): if (w.Hour < 13): printInfo("目前時間:%d點 午飯;午休" % w.Hour) else: w.SetState(AfternoonState()) w.WriteProgram(); #下午工作狀態類class AfternoonState(State): def WriteProgram(self,w): if (w.Hour < 18): printInfo("目前時間:%d點 下午狀態還不錯,繼續努力" % w.Hour) else: w.SetState(EveningState()) w.WriteProgram();#晚上工作狀態類class EveningState(State): def WriteProgram(self,w): if(w.TaskFinished): w.SetState(RestState()) w.WriteProgram() return if (w.Hour < 21): printInfo("目前時間:%d點 加班哦,好累!" % w.Hour) else: w.SetState(SleepingState()) w.WriteProgram();#睡眠狀態class SleepingState(State): def WriteProgram(self,w): printInfo("目前時間:%d點 睡覺了" % w.Hour)#下班工作狀態class RestState(State): def WriteProgram(self,w): printInfo("目前時間:%d點 下班回家了" % w.Hour) #Context:上班class Work(): state = ForenoonState(); TaskFinished = False Hour = 8.0 def SetState(self, state): self.state = state def WriteProgram(self): self.state.WriteProgram(self)def clientUI(): work = Work() for i in range(9,23,1): work.Hour = i if(i > 19): work.TaskFinished = True work.WriteProgram() returnif __name__ == '__main__': clientUI();
類圖: