状态

状态模式允许一个对象在其内部状态改变时,改变其行为,看起来其内部实现像是被修改了一样。状态模式适用于一个操作中含有庞大的多分支条件语句,并且这些分支依赖于对象的状态。这些状态通常都使用一个或者多个枚举常量表示。状态模式将每一个条件分支放入一个独立的类中,这就使得你可以根据对象自身的情况将对象的状态作为一个对象,使对象可以不依赖于其他对象而独立变化。

以下给出一个状态模式的示例。

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()