狀態模式,當物件的內部狀態改變的時候,允許物件執行不同的流程,看起來就像改寫了乙個物件,核心的方法是把複雜狀態變化情況下的流程抽象出來,簡化複雜情況狀態的判斷。
我們設計乙個應用場景:當狀態是cpu使用率,在不同狀態下的自動化運維指令碼執行不同的操作
示例code:
class base:
def executor(self, value):
self.run(value)
class low(base):
def __init__(self):
self.name = "較低佔用率狀態"
def run(self, value):
print("當前:{} 值:{}".format(self.name, value))
print("無應急情況執行")
class large(base):
def __init__(self):
self.name = "較高佔用率狀態"
def run(self, value):
print("當前:{} 值:{}".format(self.name, value))
print("傳送警報郵件")
class statu:
def __init__(self):
self.value = 0.1
self.low = low()
self.large = large()
self.ststu = none
def monitor(self):
if self.value <0.5:
self.ststu = self.low
else:
self.ststu = self.large
self.ststu.executor(self.value)
if __name__ == '__main__':
test = statu()
test.monitor()
test.value = 0.9
test.monitor()
當前:較低佔用率狀態 值:0.1
無應急情況執行
當前:較高佔用率狀態 值:0.9
傳送警報郵件
優點:1、封裝了轉換規則。
2、列舉可能的狀態,在列舉狀態之前需要確定狀態種類。
3、將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為。
4、允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊。
5、可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數。
缺點:
1、狀態模式的使用必然會增加系統類和物件的個數。
2、狀態模式的結構與實現都較為複雜,如果使用不當將導致程式結構和**的混亂。
3、狀態模式對"開閉原則"的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源**,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源**。
使用場景:1、行為隨狀態改變而改變的場景。 2、條件、分支語句的代替者。
注意事項:在行為受狀態約束的時候使用狀態模式,而且狀態不超過 5 個。
設計模式(二十一) 狀態模式
狀態模式也是一種行為型模式,當我們的程式中需要一些狀態轉換,對於不同的狀態需要不同的行為時,我們就可以考慮使用狀態模式。下面用交通燈來當例子。我們需要紅黃綠三種顏色的狀態。inte ce state class redstate implements state class yellowstate ...
設計模式(二十一) 狀態模式
狀態模式也是一種行為型模式,當我們的程式中需要一些狀態轉換,對於不同的狀態需要不同的行為時,我們就可以考慮使用狀態模式。下面用交通燈來當例子。我們需要紅黃綠三種顏色的狀態。inte ce state class redstate implements state class yellowstate ...
(二十一)狀態模式詳解(DOTA版)
本次lz給各位介紹狀態模式,之前在寫設計模式的時候,引入了一些小故事,二十章職責連模式是故事版的最後一篇,之後還剩餘四個設計模式,lz會依照原生的方式去解釋這幾個設計模式,特別是原型模式和直譯器模式,會包含一些其它的內容。好了,接下來,我們先來看看狀態模式的定義吧。定義 源於design patte...