狀態模式可以看做是在運行時改變對象行為的一種方式。狀態模式允許對象在其內部狀態變化時改變其行為,此時感覺就像對象本身已經改變了一樣。 參與者: State介面:State基類,定義不同狀態共同需要執行的介面。 ConcreteSate對象:State基類的子類,不同狀態的可以在子類介面中實現不同的操 ...
狀態模式可以看做是在運行時改變對象行為的一種方式。狀態模式允許對象在其內部狀態變化時改變其行為,此時感覺就像對象本身已經改變了一樣。
參與者:
- State介面:State基類,定義不同狀態共同需要執行的介面。
- ConcreteSate對象:State基類的子類,不同狀態的可以在子類介面中實現不同的操作。
- Context對象:客戶端需要關註的對象,此對象中維護自身的具體狀態對象,當狀態改變時,改變的是Context中的狀態對象,而Context對象是不需要改變的。
優點:
- 對象的行為是根據運行時對象的狀態而定,避免了使用大量的條件判斷來改變代碼邏輯。
- 狀態模式中,更加容易添加新的行為,只需要定義一個額外的狀態即可。
- 提高了編碼的聚合性,使得屬於同種狀態的操作被歸於一個類中。
缺點:
- 由於狀態本身的功能過於單一,可能會創建過多的狀態類,導致使用和維護都會變得非常麻煩。
- 對於Context對象,每個狀態的引入,都可能需要進行更新,並且每次更新都可能會影響到原來的行為,導致Context對象的維護變得更加困難。
簡單示例:
""" 以電飯煲為例,它有三種狀態或者說三種功能:煮飯、煮湯、煮粥 指定好電飯煲的狀態後,它就開始以對應模式進行工作 """ from abc import ABCMeta, abstractmethod class CookState(metaclass=ABCMeta): """State介面:定義狀態對象共有的介面,即需要煮什麼""" @abstractmethod def cook(self): pass class CookRice(CookState): """ConcreteSate對象:煮飯""" def cook(self): print('Cooking rice...') class CookSoup(CookState): """ConcreteSate對象:煮湯""" def cook(self): print('Cooking soup...') class CookPorridge(CookState): """ConcreteSate對象:煮粥""" def cook(self): print('Cooking porridge...') class Cooker: """Context對象:電飯煲,根據自身狀態決定煮什麼""" def __init__(self): # 定義本身具有的幾種狀態,或者電飯煲的幾種功能 self.states = [CookRice(), CookSoup(), CookPorridge()] self.state_index = 0 def switch_state(self): """切換電飯煲的狀態""" if self.state_index == (len(self.states) - 1): self.state_index = 0 else: self.state_index += 1 def start_cook(self): """開始工作""" self.states[self.state_index].cook() if __name__ == '__main__': cooker = Cooker() cooker.start_cook() cooker.switch_state() cooker.start_cook()