2 回答

TA貢獻1784條經驗 獲得超7個贊
這是您問題的簡化版本的python3中的快速而骯臟的實現。
State 是一個抽象類,使用(Mickeal 描述的 abc 包)充當接口(派生類必須實現抽象方法)。實際狀態接收請求并實現函數并執行狀態轉換這就是為什么我將 atm 對象作為參數方法傳遞
import abc
class State(object,metaclass = abc.ABCMeta):
@abc.abstractmethod
def eject(self, atm):
raise NotImplementedError('')
@abc.abstractmethod
def insert(self, atm):
raise NotImplementedError('')
class NoCard(State):
def eject(self, atm):
print('Error : no card')
def insert(self, atm):
print('ok')
atm.state = HasCard()
class HasCard(State):
def eject(self, atm):
print('ok')
atm.state = NoCard()
def insert(self, atm):
print('Error : card already present')
class ATM:
def __init__(self):
self.state = NoCard()
def insert(self):
self.state.insert(self)
def eject(self):
self.state.eject(self)
if __name__ == "__main__":
atm = ATM()
atm.eject() # default state is no card error no card
atm.insert() # ok state is has card
atm.insert() # error card already in
atm.eject() # ok state become no card
atm.eject() # error no card

TA貢獻1871條經驗 獲得超8個贊
Atm
不應該從AtmState
但從無(或從object
,無所謂)繼承。它應該只包含:state
變量、change
改變狀態AtmState
的方法以及調用當前同名方法的方法中的每個方法,并state
帶有一個名為例如atm
包含調用Atm
對象(上下文)的附加參數。
AtmState
應該只包含沒有實現的方法(并且沒有變量),因為它是原始模式中的接口。對于 Python,您應該使其成為具有抽象方法的抽象類,請參閱模塊abc
如何做到這一點。
派生自的具體類AtmState
現在應該實現這些方法。通常每個類只需要一兩個方法,其余的應該只打印一個錯誤。例如,該NoCard.ejectCard()
方法僅顯示無法彈出不存在的卡的錯誤。
通過從方法之一調用atm.change()
方法(atm
是由Atm
類添加的附加參數),可以在狀態之間切換。
添加回答
舉報