Python筆記:狀態設計模式

狀態模式能夠看作是在運行時改變對象行爲的一種方式。狀態模式容許對象在其內部狀態變化時改變其行爲,此時感受就像對象自己已經改變了同樣。編碼

參與者:spa

  • State接口:State基類,定義不一樣狀態共同須要執行的接口。
  • ConcreteSate對象:State基類的子類,不一樣狀態的能夠在子類接口中實現不一樣的操做。
  • Context對象:客戶端須要關注的對象,此對象中維護自身的具體狀態對象,當狀態改變時,改變的是Context中的狀態對象,而Context對象是不須要改變的。

優勢:code

  • 對象的行爲是根據運行時對象的狀態而定,避免了使用大量的條件判斷來改變代碼邏輯。
  • 狀態模式中,更加容易添加新的行爲,只須要定義一個額外的狀態便可。
  • 提升了編碼的聚合性,使得屬於同種狀態的操做被歸於一個類中。

缺點:對象

  • 因爲狀態自己的功能過於單一,可能會建立過多的狀態類,致使使用和維護都會變得很是麻煩。
  • 對於Context對象,每一個狀態的引入,均可能須要進行更新,而且每次更新均可能會影響到原來的行爲,致使Context對象的維護變得更加困難。

簡單示例:blog

"""
以電飯煲爲例,它有三種狀態或者說三種功能:煮飯、煮湯、煮粥
指定好電飯煲的狀態後,它就開始以對應模式進行工做
"""
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()
相關文章
相關標籤/搜索