Python設計模式-狀態模式

小屋子大俠發表於2017-06-26

Python設計模式-狀態模式

程式碼基於3.5.2,程式碼如下;

#coding:utf-8
#狀態模式

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

相關文章