原因:解決**冗餘處理效率低的問題
原有模式**
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 分支邏輯,參照狀...
設計模式之狀態模式 狀態機的實現原理
狀態模式是根據狀態的改變觸發一些動作或者行為。當乙個物件的內在狀態改變時可以改變其行為,這個物件看起來像是改變了其類。狀態模式主要有三部分狀態 事件 動作。通過一些事件會觸發狀態的改變,狀態的改變有時候也會出發一些動作。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的...