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):pass4.分別用框架模型和不用框架模型來處理下面的例子
?
? ? ? ?用水的三種狀態,理解狀態模式? ?
? ? ? 不管水是什么狀態,對象始終是水,所以會有一個 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.模型說明
? ? ?每一種狀態應當只有唯一的實例。
(1)優點:
? ? ? ? ? ? ? ?①封裝了狀態的轉換規則,在狀態模式中可以將狀態的轉換代碼封裝在環境類中,對狀態轉換代碼進行集中管理,而不是分散在一個個業務邏輯中。
? ? ? ? ? ? ? ?②將所有的與某個狀態有關的行為放到一個類中(稱為狀態類),使開發人員只專注于該狀態下的邏輯開發。
? ? ? ? ? ? ? ?③允許狀態轉換邏輯與狀態對象合為一體,使用時只需要注入一個不同的狀態對象即可,使環境對象擁有不同的行為
(2)??缺點:
? ? ? ? ? ? ? ①會增加系統類??和對象的個數
? ? ? ? ? ? ? ②?狀態模式的結構與實現都較為復雜,如果使用不當容易導致?程序結構和代碼的混亂? ?
?
6.?應用場景
?(1) 一個對象的行為取決于它的狀態,并且它在運行時可能經常改變它的狀態,從而改變它的行為。
?(2)一個操作中含有龐大的多分支的條件語句,這些分支依賴于該對象的狀態,且每一個分支的業務邏輯都非常復雜時,
? ? ? ? ? ?我們可以使用狀態模式來拆分不同的分支邏輯,使程序有更好的可讀性和可維護性。
?
?
?
總結
以上是生活随笔為你收集整理的2.设计模式中状态模式(对象的行为模式)(Python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java打印菱形(空格菱形)(星星之间有
- 下一篇: websocket python爬虫_p