狀態設計模式的簡單示例
優缺點乙個物件可以基於其內部狀態封裝多個行為。狀態模式可以看作在執行時改變物件行為的一種方式。
以收音機為例進行說明。收音機具有am/fm(切換開關)兩種調頻方式和乙個掃瞄按鈕。因此根據收音機的基本狀態(am/fm),當調諧到am或fm頻道時,掃瞄按鈕的行為就會動態的改變。
context:定義了客戶感興趣的介面。context維護了乙個concretestate子類的例項。
定義了乙個具有handle()抽象方法的狀態介面,concretestate類。
concretestatea和concretestateb用於實現狀態介面。
同時,定義的handle()方法是特定的concretestate類。context類被設定為乙個狀態時,該狀態的concrete類的handle()方法就會被呼叫
from abc import abcmeta, abstractmethod
class
state
(metaclass = abcmeta)
: @abstractmethod
defhandle
(self)
:pass
class
concretestateb
(state)
:def
handle
(self)
:print
("concretestateb"
)class
concretestatea
(state)
:def
handle
(self)
:print
("concretestatea"
)class
context
(state)
:def
__init__
(self)
: self.state =
none
defgetstate
(self)
:return self.state
defsetstate
(self, state)
: self.state = state
defhandle
(self)
: self.state.handle(
)context = context(
)statea = concretestatea(
)stateb = concretestateb(
)context.setstate(statea)
context.handle(
)
concretestatea
[外鏈轉存失敗(img-4riellgi-1566568811213)(assets/1563798041265.png)]
以簡單的按鈕來實現電視遙控器,執行開/關動作。
from abc import abcmeta, abstractmethod
class
state
(metaclass = abcmeta)
: @abstractmethod
defdothis
(self)
:pass
class
startstate
(state)
:def
dothis
(self)
:print
("tv switching on..."
)class
stopstate
(state)
:def
dothis
(self)
:print
("tv switching off..."
)class
tvcontext
(state)
:def
__init__
(self)
: self.state =
none
defgetstate
(self)
:return self.state
defsetstate
(self, state)
: self.state = state
defdothis
(self)
: self.state.dothis(
)context = tvcontext(
)context.getstate(
)start = startstate(
)stop = stopstate(
)context.setstate(stop)
context.dothis(
)
tv switching off...
模擬乙個計算的狀態
它可以由多個狀態,如關機、開機、掛起或休眠。
class
computerstate
(object):
name =
"state"
allowed =
defswitch
(self, state)
:if state.name in self.allowed:
print
("current:"
, self,
"=> switched to new state"
,state.name)
self.__class__ = state
else
:print
("current:"
,self,
"=> switching to"
, state.name,
"not possible."
)def
__str__
(self)
:return self.name
class
off(computerstate)
: name =
"off"
allowed =
['on'
]class
on(computerstate)
: name =
'on'
allowed =
['off'
,'suspend'
,'hibernate'
]class
suspend
(computerstate)
: name =
'suspend'
allowed =
['on'
]class
hibernate
(computerstate)
: name =
'hibernate'
allowed =
['on'
]class
computer
(object):
def__init__
(self, model =
'hp'):
self.model = model
self.state = off(
)def
change
(self, state)
: self.state.switch(state)
if __name__ ==
'__main__'
: comp = computer(
) comp.change(on)
comp.change(off)
comp.change(on)
comp.change(suspend)
comp.change(hibernate)
comp.change(on)
comp.change(off)
優點:
缺點:
Python 設計模式 狀態模式
狀態模式 狀態模式 state pattern 是設計模式的一種,屬於行為模式。定義 源於design pattern 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系...
python設計模式之狀態模式
狀態模式是一種常用的模式,和名字一樣,可以在呼叫時修改其內部屬性,看起來就像改變了類的狀態 class networkcardstate 基類 defsend self raise notimplementederror defreceive self raise notimplementederr...
Python設計模式之狀態模式
狀態模式和責任鏈模式是真的很像 狀態模式學習鏈結 責任鏈模式和狀態模式對比 usr bin python coding utf8 狀態模式 usr bin env python coding utf 8 author andy 大話設計模式 設計模式 狀態模式 狀態模式 state pattern ...