亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python設(shè)計模式中的狀態(tài)模式你了解嗎

 更新時間:2022年02月15日 10:35:43   作者:范桂颶  
這篇文章主要為大家詳細(xì)介紹了Python設(shè)計模式中的狀態(tài)模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

狀態(tài)模式

狀態(tài)模式,當(dāng)對象的內(nèi)部狀態(tài)發(fā)生了改變的時候,允許對象執(zhí)行不同的流程。

在這里插入圖片描述

優(yōu)點

  • 封裝了狀態(tài)轉(zhuǎn)換規(guī)則。
  • 枚舉了可能的狀態(tài),在枚舉狀態(tài)之前需要確定狀態(tài)的種類。
  • 將所有與某個狀態(tài)有關(guān)的行為放到一個類中,并且可以方便地增加新的狀態(tài),只需要改變對象狀態(tài)即可改變對象的行為。
  • 允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對象合成一體,而不是某一個巨大的條件語句塊。
  • 可以讓多個環(huán)境對象共享一個狀態(tài)對象,從而減少系統(tǒng)中對象的個數(shù)。

缺點

  • 狀態(tài)模式的使用必然會增加系統(tǒng)類和對象的個數(shù)。
  • 狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂。
  • 狀態(tài)模式對 “開閉原則” 并不太好,對于可以切換狀態(tài)的狀態(tài)模式,增加新的狀態(tài)類需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無法切換到新增狀態(tài),而且修改某個狀態(tài)類的行為也需修改對應(yīng)類的源代碼。

應(yīng)用場景

  • 行為隨狀態(tài)改變而改變的場景。
  • 條件、分支語句的代替者。

代碼示例

在這里插入圖片描述

這是一個狀態(tài)圖,具有 “有 25 分錢”、“沒有 25 分錢”、“售出糖果”、“糖果售罄” 這 4 個狀態(tài)。同時也對應(yīng) 4 個動作:“投入 25 分錢”,“退回 25 分錢”,“轉(zhuǎn)動曲柄” 和 “發(fā)放糖果”。

class State:
    # 定義state基類
    def insert_quarter(self):
        pass
    def eject_quarter(self):
        pass
    def turn_crank(self):
        pass
    def dispense(self):
        pass

class SoldOutState(State):
    # 繼承State 類
    def __init__(self, gumball_machine):
        self.gumball_machine = gumball_machine
    def __str__(self):
        return "sold_out"
    def insert_quarter(self):
        print("You can't insert a quarter, the machine is sold out")
    def eject_quarter(self):
        print("You can't eject, you haven't inserted a quarter yet")
    def turn_crank(self):
        print("You turned, but ther are no gumballs")
    def dispense(self):
        print("No gumball dispensed")

class SoldState(State):
    # 繼承State 類
    def __init__(self, gumball_machine):
        self.gumball_machine = gumball_machine
    def __str__(self):
        return "sold"
    def insert_quarter(self):
        print("Please wait, we're already giving you a gumball")
    def eject_quarter(self):
        print("Sorry, you already turned the crank")
    def turn_crank(self):
        print("Turning twice doesn't get you another gumball")
    def dispense(self):
        self.gumball_machine.release_ball()
        if gumball_machine.count > 0:
            self.gumball_machine.state = self.gumball_machine.no_quarter_state
        else:
            print("Oops, out of gumballs!")
            self.gumball_machine.state = self.gumball_machine.soldout_state

class NoQuarterState(State):
    # 繼承State 類
    def __init__(self, gumball_machine):
        self.gumball_machine = gumball_machine
    def __str__(self):
        return "no_quarter"
    def insert_quarter(self):
        # 投幣 并且改變狀態(tài)
        print("You inserted a quarter")
        self.gumball_machine.state = self.gumball_machine.has_quarter_state
    def eject_quarter(self):
        print("You haven't insert a quarter")
    def turn_crank(self):
        print("You turned, but there's no quarter")
    def dispense(self):
        print("You need to pay first")

class HasQuarterState(State):
    # 繼承State 類
    def __init__(self, gumball_machine):
        self.gumball_machine = gumball_machine
    def __str__(self):
        return "has_quarter"
    def insert_quarter(self):
        print("You can't insert another quarter")
    def eject_quarter(self):
        print("Quarter returned")
        self.gumball_machine.state = self.gumball_machine.no_quarter_state
    def turn_crank(self):
        print("You turned...")
        self.gumball_machine.state = self.gumball_machine.sold_state
    def dispense(self):
        print("No gumball dispensed")

class GumballMachine:
    def __init__(self, count=0):
        self.count = count
        # 找出所有狀態(tài),并創(chuàng)建實例變量來持有當(dāng)前狀態(tài),然后定義狀態(tài)的值
        self.soldout_state = SoldOutState(self)
        self.no_quarter_state = NoQuarterState(self)
        self.has_quarter_state = HasQuarterState(self)
        self.sold_state = SoldState(self)
        if count > 0:
            self.state = self.no_quarter_state
        else:
            self.state = self.soldout_state
    def __str__(self):
        return ">>> Gumball machine current state: %s" % self.state
    def insert_quarter(self):
        # 投入25分錢
        self.state.insert_quarter()
    def eject_quarter(self):
        # 退回25分
        self.state.eject_quarter()
        # print("state", self.state, type(self.state))
    def turn_crank(self):
        # 轉(zhuǎn)動曲柄
        # print("state", self.state, type(self.state))
        self.state.turn_crank()
    def release_ball(self):
        # 發(fā)放糖果
        print("A gumball comes rolling out the slot...")
        if self.count > 0:
            self.count -= 1
        
if __name__ == "__main__":
    # 以下是代碼測試
    gumball_machine = GumballMachine(5) # 裝入5 個糖果
    print(gumball_machine)
    gumball_machine.insert_quarter() # 投入25分錢
    gumball_machine.turn_crank() # 轉(zhuǎn)動曲柄
    print(gumball_machine)
    gumball_machine.insert_quarter() #投入25分錢
    gumball_machine.eject_quarter()  # 退錢
    gumball_machine.turn_crank()     # 轉(zhuǎn)動曲柄
    print(gumball_machine)
    gumball_machine.insert_quarter() # 投入25分錢
    gumball_machine.turn_crank() # 轉(zhuǎn)動曲柄 
    gumball_machine.insert_quarter() # 投入25分錢 
    gumball_machine.turn_crank()  # 轉(zhuǎn)動曲柄
    gumball_machine.eject_quarter() # 退錢
    print(gumball_machine)

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • 如何用python腳本實現(xiàn)一次獲取token,多次使用token

    如何用python腳本實現(xiàn)一次獲取token,多次使用token

    這篇文章主要介紹了如何用python腳本實現(xiàn)一次獲取token,多次使用token問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用Python的內(nèi)建模塊collections的教程

    使用Python的內(nèi)建模塊collections的教程

    這篇文章主要介紹了使用Python的內(nèi)建模塊collections的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python分割列表list方法使用(平均n等份拆成)

    Python分割列表list方法使用(平均n等份拆成)

    本文主要介紹了Python分割列表list方法使用(平均n等份拆成),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • pycharm不在cmd中運行卻在python控制臺運行問題解決

    pycharm不在cmd中運行卻在python控制臺運行問題解決

    這篇文章主要介紹了pycharm不在cmd中運行卻在python控制臺運行問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • python中的decorator的作用詳解

    python中的decorator的作用詳解

    這篇文章主要介紹了python中的decorator的作用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • python如何把嵌套列表轉(zhuǎn)變成普通列表

    python如何把嵌套列表轉(zhuǎn)變成普通列表

    這篇文章主要為大家詳細(xì)介紹了python如何把嵌套列表轉(zhuǎn)變成普通列表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 如何基于Python Matplotlib實現(xiàn)網(wǎng)格動畫

    如何基于Python Matplotlib實現(xiàn)網(wǎng)格動畫

    這篇文章主要介紹了如何基于Python Matplotlib實現(xiàn)網(wǎng)格動畫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 分析Python讀取文件時的路徑問題

    分析Python讀取文件時的路徑問題

    本篇文章通過圖文實例的方式給大家詳細(xì)分析了Python讀取文件時的路徑問題,對此有需求的朋友可以參考學(xué)習(xí)下。
    2018-02-02
  • Python BautifulSoup 節(jié)點信息

    Python BautifulSoup 節(jié)點信息

    這篇文章主要介紹了Python BautifulSoup 節(jié)點信息,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 學(xué)生信息管理系統(tǒng)python版

    學(xué)生信息管理系統(tǒng)python版

    這篇文章主要為大家詳細(xì)介紹了學(xué)生信息管理系統(tǒng)python版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10

最新評論