最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

狀態(tài)模式

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

在這里插入圖片描述

優(yōu)點(diǎn)

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

缺點(diǎn)

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

應(yīng)用場(chǎng)景

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

代碼示例

在這里插入圖片描述

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

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

class SoldOutState(State):
    # 繼承State 類(lèi)
    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 類(lèi)
    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 類(lèi)
    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 類(lèi)
    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)建實(shí)例變量來(lái)持有當(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分錢(qián)
        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)動(dòng)曲柄
        # 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__":
    # 以下是代碼測(cè)試
    gumball_machine = GumballMachine(5) # 裝入5 個(gè)糖果
    print(gumball_machine)
    gumball_machine.insert_quarter() # 投入25分錢(qián)
    gumball_machine.turn_crank() # 轉(zhuǎn)動(dòng)曲柄
    print(gumball_machine)
    gumball_machine.insert_quarter() #投入25分錢(qián)
    gumball_machine.eject_quarter()  # 退錢(qián)
    gumball_machine.turn_crank()     # 轉(zhuǎn)動(dòng)曲柄
    print(gumball_machine)
    gumball_machine.insert_quarter() # 投入25分錢(qián)
    gumball_machine.turn_crank() # 轉(zhuǎn)動(dòng)曲柄 
    gumball_machine.insert_quarter() # 投入25分錢(qián) 
    gumball_machine.turn_crank()  # 轉(zhuǎn)動(dòng)曲柄
    gumball_machine.eject_quarter() # 退錢(qián)
    print(gumball_machine)

總結(jié)

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

相關(guān)文章

  • python之yield和Generator深入解析

    python之yield和Generator深入解析

    這篇文章主要介紹了python之yield和Generator深入解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python速成篇之像selenium一樣操作電腦詳解

    Python速成篇之像selenium一樣操作電腦詳解

    這篇文章為大家介紹了在Python中如何像selenium一樣操作電腦,本文主要使用的是pyautogui庫(kù),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • jupyter?notebook?自定義python解釋器的過(guò)程詳解

    jupyter?notebook?自定義python解釋器的過(guò)程詳解

    大家都知道jupyter?notebook?網(wǎng)頁(yè)版交互環(huán)境,類(lèi)似于ipython,功能強(qiáng)大,這篇文章主要介紹了jupyter?notebook?自定義python解釋器的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • Keras 數(shù)據(jù)增強(qiáng)ImageDataGenerator多輸入多輸出實(shí)例

    Keras 數(shù)據(jù)增強(qiáng)ImageDataGenerator多輸入多輸出實(shí)例

    這篇文章主要介紹了Keras 數(shù)據(jù)增強(qiáng)ImageDataGenerator多輸入多輸出實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • NumPy隨機(jī)數(shù)據(jù)分布與Seaborn可視化詳解

    NumPy隨機(jī)數(shù)據(jù)分布與Seaborn可視化詳解

    數(shù)據(jù)分布是指數(shù)據(jù)集中所有可能值出現(xiàn)的頻率,并用概率來(lái)表示,它描述了數(shù)據(jù)取值的可能性,Seaborn 是一個(gè)基于 Matplotlib 的 Python 數(shù)據(jù)可視化庫(kù),用于創(chuàng)建統(tǒng)計(jì)圖表,本文就給大家詳細(xì)的介紹一下NumPy隨機(jī)數(shù)據(jù)分布與Seaborn可視化,需要的朋友可以參考下
    2024-05-05
  • 詳解Python list和numpy array的存儲(chǔ)和讀取方法

    詳解Python list和numpy array的存儲(chǔ)和讀取方法

    這篇文章主要介紹了詳解Python list和numpy array的存儲(chǔ)和讀取方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python3 實(shí)現(xiàn)調(diào)用串口功能

    python3 實(shí)現(xiàn)調(diào)用串口功能

    今天小編就為大家分享一篇python3 實(shí)現(xiàn)調(diào)用串口功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python pickle模塊用法實(shí)例

    Python pickle模塊用法實(shí)例

    這篇文章主要介紹了Python pickle模塊用法實(shí)例,python的pickle模塊實(shí)現(xiàn)了基本的數(shù)據(jù)序列和反序列化,需要的朋友可以參考下
    2015-04-04
  • python開(kāi)發(fā)簡(jiǎn)單的命令行工具簡(jiǎn)介

    python開(kāi)發(fā)簡(jiǎn)單的命令行工具簡(jiǎn)介

    這篇文章主要介紹了python開(kāi)發(fā)簡(jiǎn)單的命令行工具實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • python:動(dòng)態(tài)路由的Flask程序代碼

    python:動(dòng)態(tài)路由的Flask程序代碼

    今天小編就為大家分享一篇python:動(dòng)態(tài)路由的Flask程序代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11

最新評(píng)論

彭阳县| 博罗县| 平阴县| 晴隆县| 额敏县| 依安县| 琼海市| 麟游县| 马鞍山市| 永修县| 简阳市| 崇明县| 辰溪县| 南郑县| 枞阳县| 南康市| 邹平县| 咸阳市| 横山县| 甘肃省| 东宁县| 新乐市| 登封市| 正蓝旗| 天祝| 涟水县| 龙井市| 斗六市| 伊宁市| 广河县| 瑞丽市| 白沙| 岑巩县| 大理市| 祥云县| 洪雅县| 五莲县| 高淳县| 威信县| 仁化县| 平顺县|