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
类添加的附加参数),可以在状态之间切换。
添加回答
举报