日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

2.设计模式中状态模式(对象的行为模式)(Python实现)

發布時間:2024/9/30 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.设计模式中状态模式(对象的行为模式)(Python实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.什么是狀態模式?

2.狀態模式的設計思想

3.狀態模式的代碼框架模型

4.分別用框架模型和不用框架模型來處理下面的例子

5.模型說明

6.?應用場景

1.什么是狀態模式?

? ? 如水一般,狀態即事物所處的某一種形態。狀態模式是說一個對象在其內部狀態發生改變時,其表現的行為和外在的屬性不一樣,這個對象看上去就像改變了它的類型一樣。因此,狀態模式又稱為對象的行為模式

2.狀態模式的設計思想

? ? 水有三種不同的狀態,冰、水、水蒸氣。三種不同的狀態有著完全不一樣的外在特性。三種狀態也是相差巨大,但其實內部組成都是一樣的,都是水分子。

? ? ?狀態模式的核心思想就是一個事物(對象)有多種狀態,在不同的狀態下所表現出來的行為和屬性不一樣

3.狀態模式的代碼框架模型

# 引入 ABCMeta 和 abstractmethod 來定義抽象類和抽象方法 from abc import ABCMeta,abstractmethodclass Context(metaclass=ABCMeta):"""狀態模式的上下文環境類"""def __init__(self):self.__states = []self.__curState = None# 狀態發生變化依賴的屬性,當這一變量由多個變量共同決定時可以將其單獨定義成一個類self.__stateInfo = 0def addState(self, state):if state not in self.__states:self.__states.append(state)def changeState(self, state):if state is None:return Falseif self.__curState is None:print("初始化為",state.getName())else:print("由",self.__curState.getName(),"變為",state.getName())self.__curState = stateself.addState(state)return Truedef getState(self):return self.__curStatedef __setStateInfo(self, stateInfo):self.__stateInfo = stateInfofor state in self.__states:if state.isMatch(stateInfo):self.changeState(state)def __getStateInfo(self):return self.__stateInfoclass State:"""狀態的基類"""def __init__(self, name):self.__name = namedef getName(self):return self.__namedef isMatch(self, stateInfo):"""狀態的屬性 stateInfo 是否在當前的狀態范圍"""return False@abstractmethoddef behavior(self, context):pass

4.分別用框架模型和不用框架模型來處理下面的例子

?

? ? ? ?用水的三種狀態,理解狀態模式? ?

? ? ? 不管水是什么狀態,對象始終是水,所以會有一個 Water類,而它有三種狀態,我們可以定義三個狀態類,

? ? ? SolidState、LiquidState、GaseousState;?就單從這三個單詞中每個都有個State的后綴,可以抽出一個更抽象的類

? ? ? ?這個類就是狀態類(State)。

? ?

首先不用框架模型

# 引入 ABCMeta 和 abstractmethod 來定義抽象類和抽象方法 from abc import ABCMeta, abstractmethodclass Water:"""水"""def __init__(self, state):self.__temperature = 25 # 默認常溫為25℃self.__state = state# 設置狀態def setState(self, state):self.__state = state# 改變狀態def changeState(self, state):if self.__state:print("由", self.__state.getName(), "變為", state.getName())else:print("初始化為", state.getName())self.__state = state# 獲取溫度def getTemperature(self):return self.__temperature# 設置溫度def setTemperature(self, temperature):self.__temperature = temperatureif self.__temperature <= 0:self.changeState(SolidState("固態"))elif self.__temperature <= 100:self.changeState(LiquidState("液態"))else:self.changeState(GaseousState("氣態"))# 提升溫度def riseTemperature(self, step):self.setTemperature(self.__temperature + step)# 降低溫度def reduceTemperature(self, step):self.setTemperature(self.__temperature - step)# 表現出的形態def behavior(self):self.__state.behavior(self)class State(metaclass=ABCMeta):"""狀態的基類"""def __init__(self, name):self.__name = namedef getName(self):return self.__namedef isMatch(self, stateInfo):"""狀態的屬性 stateInfo 是否在當前的狀態范圍"""return False@abstractmethoddef behavior(self, water):"""不同狀態下的行為"""passclass SolidState(State):"""固態"""def __init__(self, name):super().__init__(name)def behavior(self, water):print("當前的溫度" + str(water.getTemperature()) + "℃,為固態冰")class LiquidState(State):"""液態"""def __init__(self, name):super().__init__(name)def behavior(self, water):print("當前的溫度" + str(water.getTemperature()) + "℃,為液態水")class GaseousState(State):"""氣態"""def __init__(self, name):super().__init__(name)def behavior(self, water):print("當前的溫度" + str(water.getTemperature()) + "℃,為氣態水蒸氣")def testState():water = Water(LiquidState("液態"))water.behavior()water.setTemperature(-4)water.behavior()water.riseTemperature(18)water.behavior()water.riseTemperature(110)water.behavior()testState()

首先設置狀態為液態,然后調用behavior()方法,看表現的狀態,再進行設置溫度,以及提升溫度,看它不同的溫度所表現的狀態

運行結果:

State是抽象狀態類(基類),負責狀態的定義和接口的統一。

使用框架模式,

# 引入 ABCMeta 和 abstractmethod 來定義抽象類和抽象方法 from abc import ABCMeta, abstractmethodclass Context(metaclass=ABCMeta):"""狀態模式的上下文環境類"""def __init__(self):self.__states = []self.__curState = Noneself.__stateInfo = None# 狀態發生變化依賴的屬性,當這一變量由多個變量共同決定時可以將其單獨定義成一個類self._stateInfo = 0def addState(self, state):if state not in self.__states:self.__states.append(state)def changeState(self, state):if state is None:return Falseif self.__curState is None:print("初始化為", state.getName())else:print("由", self.__curState.getName(), "變為", state.getName())self.__curState = stateself.addState(state)return Truedef getState(self):return self.__curStatedef setStateInfo(self, stateInfo):self.__stateInfo = stateInfofor state in self.__states:if state.isMatch(stateInfo):self.changeState(state)def getStateInfo(self):return self.__stateInfoclass Water(Context):"""水"""def __init__(self):super().__init__()# 添加三種狀態self.addState(SolidState("固態"))self.addState(LiquidState("液態"))self.addState(GaseousState("氣態"))# 設置溫度self.setTemperature(25)def getTemperature(self):return self.getStateInfo()def setTemperature(self, temperature):self.setStateInfo(temperature)def riseTemperature(self, step):self.setTemperature(self.getTemperature() + step)def reduceTemperature(self, step):self.setTemperature(self.getTemperature() - step)def behavior(self):# 獲取狀態state = self.getState()if isinstance(state, State):state.behavior(self)# 單例的裝飾器 def singleton(cls, *args, **kwargs):"""構造一個單例的裝飾器"""instance = {}def _singleton(*args, **kwargs):if cls not in instance:instance[cls] = cls(*args, **kwargs)return instance[cls]return _singletonclass State(metaclass=ABCMeta):"""狀態的基類"""def __init__(self, name):self.__name = namedef getName(self):return self.__namedef isMatch(self, stateInfo):"""狀態的屬性 stateInfo 是否在當前的狀態范圍"""return False@abstractmethoddef behavior(self, water):"""不同狀態下的行為"""pass@singleton class SolidState(State):"""固態"""def __init__(self, name):super().__init__(name)def isMatch(self, stateInfo):return stateInfo < 0def behavior(self, context):print("當前的溫度" + str(context.getStateInfo()) + "℃,為固態冰")class LiquidState(State):"""液態"""def __init__(self, name):super().__init__(name)def isMatch(self, stateInfo):return 0 <= stateInfo < 100def behavior(self, context):print("當前的溫度" + str(context.getStateInfo()) + "℃,為液態水")class GaseousState(State):"""氣態"""def __init__(self, name):super().__init__(name)# 當溫度大于100,即為氣態,范圍truedef isMatch(self, stateInfo):return stateInfo >= 100def behavior(self, context):print("當前的溫度" + str(context.getStateInfo()) + "℃,為氣態水蒸氣")def testState():water = Water()water.behavior()water.setTemperature(-4) # 設置溫度water.behavior()water.riseTemperature(18) # 提升溫度18℃water.behavior()water.riseTemperature(110) # 提升溫度110℃water.behavior()testState()

運行結果:

5.模型說明

  • 設計要點? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?在實現狀態模式的時候,實現的場景狀態有時候會非常復雜,決定狀態變化的因素也非常多,我們可以把決定狀態變化的屬性單獨抽象成一個類StateInfo,這樣判斷狀態屬性是否符合當前的狀態isMatch時,就可以傳入更多的信息。
    ? ? ?每一種狀態應當只有唯一的實例
  • 狀態模式的優缺點
    (1)優點
    ? ? ? ? ? ? ? ?①封裝了狀態的轉換規則,在狀態模式中可以將狀態的轉換代碼封裝在環境類中,對狀態轉換代碼進行集中管理,而不是分散在一個個業務邏輯中。
    ? ? ? ? ? ? ? ?②將所有的與某個狀態有關的行為放到一個類中(稱為狀態類),使開發人員只專注于該狀態下的邏輯開發。
    ? ? ? ? ? ? ? ?③允許狀態轉換邏輯與狀態對象合為一體,使用時只需要注入一個不同的狀態對象即可,使環境對象擁有不同的行為
    (2)??缺點:
    ? ? ? ? ? ? ? ①會增加系統類??和對象的個數
    ? ? ? ? ? ? ? ②?狀態模式的結構與實現都較為復雜,如果使用不當容易導致?程序結構和代碼的混亂? ?
    ?
  • 6.?應用場景

    ?(1) 一個對象的行為取決于它的狀態,并且它在運行時可能經常改變它的狀態,從而改變它的行為。

    ?(2)一個操作中含有龐大的多分支的條件語句,這些分支依賴于該對象的狀態,且每一個分支的業務邏輯都非常復雜時,

    ? ? ? ? ? ?我們可以使用狀態模式來拆分不同的分支邏輯,使程序有更好的可讀性和可維護性。

    ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的2.设计模式中状态模式(对象的行为模式)(Python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。