状态
状态模式允许一个对象在其内部状态改变时,改变其行为,看起来其内部实现像是被修改了一样。状态模式适用于一个操作中含有庞大的多分支条件语句,并且这些分支依赖于对象的状态。这些状态通常都使用一个或者多个枚举常量表示。状态模式将每一个条件分支放入一个独立的类中,这就使得你可以根据对象自身的情况将对象的状态作为一个对象,使对象可以不依赖于其他对象而独立变化。
以下给出一个状态模式的示例。
class State(object):
"""这是一个基本状态,用于在状态间共享功能"""
def scan(self):
self.pos += 1
if self.pos == len(self.stations):
self.pos = 0
print("Scanning...")
class AMState(State):
def __init__(self, radio):
self.radio = radio
self.stations = ["15", "38", "96"]
self.pos = 0
self.name = "AM"
def toggle_am_fm(self):
print("Swtich AM -> FM")
self.radio.state = self.radio.fmstate
class FMState(State):
def __init__(self, radio):
self.radio = radio
self.stations = ["81", "99", "106"]
self.pos = 0
self.name = "AM"
def toggle_am_fm(self):
print("Swtich AM -> FM")
self.radio.state = self.radio.amstate
class Radio(object):
def __init__(self):
self.amstate = AMState(self)
self.fmstate = FMState(self)
self.state = self.amstate
def toggle_am_fm(self):
self.state.toggle_am_fm()
def scan(self):
self.state.scan()
radio = Radio()
actions = [radio.scan] * 2 + [radio.toggle_am_fm] + [radio.scan] * 2
actions = actions * 2
for action in actions:
action()