Python 狀態機模式的實現

2021-10-01 22:59:48 字數 3134 閱讀 2351

原因:解決**冗餘處理效率低的問題

原有模式**

class

connection

:""" 普通方案,好多個判斷語句,效率低下"""

def__init__

(self)

: self.state =

'closed'

defread

(self)

:if self.state !=

'open'

:raise runtimeerror(

'not open'

)print

('reading'

)def

write

(self, data)

:if self.state !=

'open'

:raise runtimeerror(

'not open'

)print

('writing'

)def

open

(self)

:if self.state ==

'open'

:raise runtimeerror(

'already open'

) self.state =

'open'

defclose

(self)

:if self.state ==

'closed'

:raise runtimeerror(

'already closed'

) self.state =

'closed'

原理:為每乙個狀態定義乙個物件,並通過例項方法在不同的狀態之間進行轉換

class

connection1

:""" 新方案——對每個狀態定義乙個類,connection1類為主類"""

def__init__

(self)

:#初始狀態為closed狀態,為closedconnectionstate的例項

self.new_state(closedconnectionstate)

defnew_state

(self, newstate)

: self._state = newstate # delegate to the state class

defread

(self)

:#呼叫的是所屬例項的方法(close/open)

return self._state.read(self)

defwrite

(self, data)

:return self._state.write(self, data)

defopen

(self)

:return self._state.

open

(self)

defclose

(self)

:return self._state.close(self)

# connection state base class

class

connectionstate

: @staticmethod

defread

(conn)

:#子類必須實現父類的方法,否則報下列錯誤

raise notimplementederror(

) @staticmethod

defwrite

(conn, data)

:raise notimplementederror(

) @staticmethod

defopen

(conn)

:raise notimplementederror(

) @staticmethod

defclose

(conn)

:raise notimplementederror(

)# implementation of different states

class

closedconnectionstate

(connectionstate)

: @staticmethod

defread

(conn)

:raise runtimeerror(

'not open'

) @staticmethod

defwrite

(conn, data)

:raise runtimeerror(

'not open'

) @staticmethod

defopen

(conn)

: conn.new_state(openconnectionstate)

@staticmethod

defclose

(conn)

:raise runtimeerror(

'already closed'

)class

openconnectionstate

(connectionstate)

: @staticmethod

defread

(conn)

:print

('reading'

) @staticmethod

defwrite

(conn, data)

:print

('writing'

) @staticmethod

defopen

(conn)

:raise runtimeerror(

'already open'

) @staticmethod

defclose

(conn)

:#轉換為close例項,呼叫父類的new_state方法

conn.new_state(closedconnectionstate)

**呼叫

c = connection1(

)c._state

python 狀態機 Python 狀態機

class statemachine def init self self.handlers 狀態轉移函式字典 self.startstate none 初始狀態 self.endstate 最終狀態集合 引數name為狀態名,handler為狀態轉移函式,end state表明是否為最終狀態 de...

狀態機模式

狀態機又叫有限狀態機,它有 3 個部分組成 狀態 事件 動作。其中,事件也稱為轉移條件。事件觸發狀態的轉移及動作的執行。不過,動作不是必須的,也可能只轉移狀態,不執行任何動作。針對狀態機,有三種實現方式。第一種實現方式叫分支邏輯法。利用 if else 或者 switch case 分支邏輯,參照狀...

設計模式之狀態模式 狀態機的實現原理

狀態模式是根據狀態的改變觸發一些動作或者行為。當乙個物件的內在狀態改變時可以改變其行為,這個物件看起來像是改變了其類。狀態模式主要有三部分狀態 事件 動作。通過一些事件會觸發狀態的改變,狀態的改變有時候也會出發一些動作。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的...