Python設計模式 狀態設計模式

2021-09-26 10:38:08 字數 4035 閱讀 9095

狀態設計模式的簡單示例

優缺點乙個物件可以基於其內部狀態封裝多個行為。狀態模式可以看作在執行時改變物件行為的一種方式。

以收音機為例進行說明。收音機具有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 ...