2 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是您問題的簡(jiǎn)化版本的python3中的快速而骯臟的實(shí)現(xiàn)。
State 是一個(gè)抽象類,使用(Mickeal 描述的 abc 包)充當(dāng)接口(派生類必須實(shí)現(xiàn)抽象方法)。實(shí)際狀態(tài)接收請(qǐng)求并實(shí)現(xiàn)函數(shù)并執(zhí)行狀態(tài)轉(zhuǎn)換這就是為什么我將 atm 對(duì)象作為參數(shù)方法傳遞
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貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
Atm
不應(yīng)該從AtmState
但從無(wú)(或從object
,無(wú)所謂)繼承。它應(yīng)該只包含:state
變量、change
改變狀態(tài)AtmState
的方法以及調(diào)用當(dāng)前同名方法的方法中的每個(gè)方法,并state
帶有一個(gè)名為例如atm
包含調(diào)用Atm
對(duì)象(上下文)的附加參數(shù)。
AtmState
應(yīng)該只包含沒有實(shí)現(xiàn)的方法(并且沒有變量),因?yàn)樗窃寄J街械慕涌?。?duì)于 Python,您應(yīng)該使其成為具有抽象方法的抽象類,請(qǐng)參閱模塊abc
如何做到這一點(diǎn)。
派生自的具體類AtmState
現(xiàn)在應(yīng)該實(shí)現(xiàn)這些方法。通常每個(gè)類只需要一兩個(gè)方法,其余的應(yīng)該只打印一個(gè)錯(cuò)誤。例如,該NoCard.ejectCard()
方法僅顯示無(wú)法彈出不存在的卡的錯(cuò)誤。
通過從方法之一調(diào)用atm.change()
方法(atm
是由Atm
類添加的附加參數(shù)),可以在狀態(tài)之間切換。
添加回答
舉報(bào)