--[[ 狀態模式(State Pattern)是設計模式的一種,屬於行為模式。 適用場景: 1.一個對象的行為取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行為。 2.一個操作中含有龐大的多分支結構,並且這些分支決定於對象的狀態。 ]]-- Work = {} function Work:new(o,s) o = o or {} setmetatable(o,self) self.__index = self o.hour = 0 o.currentstate = s return o; end function Work:SetTime(h) self.hour = h end function Work:GetTime() return self.hour end function Work:SetState(s) self.currentstate = s end function Work:WriteProgram() self.currentstate:WriteProgram(self) end State = {} function State:new(o) o = o or {} setmetatable(o,self) self.__index = self return o; end MorningState = State:new() function MorningState:WriteProgram(w) if w.hour < 12 and w.hour >= 9 then print("早上寫代碼,精神百倍") else w:SetState(NoonState:new()) w:WriteProgram() end end NoonState = State:new() function NoonState:WriteProgram(w) if w.hour < 14 and w.hour >= 12 then print("中午寫代碼,犯困了,先小睡一下再說") else w:SetState(AfternoonState:new()) w:WriteProgram() end end AfternoonState = State:new() function AfternoonState:WriteProgram(w) if w.hour < 17 and w.hour >= 14 then print("下午寫代碼, 精神充足") else w:SetState(EveningState:new()) w:WriteProgram() end end EveningState = State:new() function EveningState:WriteProgram(w) if w.hour < 20 and w.hour >=17 then print("傍晚寫代碼,有點累,但還是繼續") else w:SetState(NightState:new()) w:WriteProgram() end end NightState = State:new() function NightState:WriteProgram(w) if w.hour < 22 and w.hour >= 20 then print("晚上寫代碼,苦逼啊") else w:SetState(MidnightState:new()) w:WriteProgram() end end MidnightState = State:new() function MidnightState:WriteProgram(w) if w.hour < 9 or w.hour >= 22 then print("深夜寫代碼,尼瑪,先睡醒了再說") else w:SetState(MorningState:new()) w:WriteProgram() end end w = Work:new(nil,MorningState:new()) w:SetTime(21) w:WriteProgram() w:SetTime(18) w:WriteProgram() w:SetTime(10) w:WriteProgram() w:SetTime(13) w:WriteProgram() w:SetTime(15) w:WriteProgram() w:SetTime(23) w:WriteProgram()