状态模式
面向对象编程着力于在对象交互时改变他们的状态。
状态模式关注的是实现一个状态机,状态的核心部分是状态和状态之间的转换。每个部分具体如何实现并不重要

from state_machine import State, Event, acts_as_state_machine, after, before, InvalidStateTransition
@acts_as_state_machine
class Process:
created = State(initial=True)
waiting = State()
running = State()
terminated = State()
blocked = State()
swapped_out_waiting = State()
swapped_out_blocked = State()
wait = Event(from_states=(created, running, blocked,
swapped_out_waiting), to_state=waiting)
run = Event(from_states=waiting, to_state=running)
terminate = Event(from_states=running, to_state=terminated)
block = Event(from_states=(running, swapped_out_blocked),
to_state=blocked)
swap_wait = Event(from_states=waiting, to_state=swapped_out_waiting)
swap_block = Event(from_states=blocked, to_state=swapped_out_blocked)
def __init__(self, name):
self.name = name
@after('wait')
def wait_info(self):
print('{} entered waiting mode'.format(self.name))
@after('run')
def run_info(self):
print('{} is running'.format(self.name))
@before('terminate')
def terminate_info(self):
print('{} terminated'.format(self.name))
@after('block')
def block_info(self):
print('{} is blocked'.format(self.name))
@after('swap_wait')
def swap_wait_info(self):
print('{} is swapped out and waiting'.format(self.name))
@after('swap_block')
def swap_block_info(self):
print('{} is swapped out and blocked'.format(self.name))
def transition(process, event, event_name):
try:
event()
except InvalidStateTransition as err:
print('Error: transition of {} from {} to {} failed'.format(process.name,
process.current_state, event_name))
def state_info(process):
print('state of {}: {}'.format(process.name, process.current_state))
def main():
RUNNING = 'running'
WAITING = 'waiting'
BLOCKED = 'blocked'
TERMINATED = 'terminated'
p1, p2 = Process('process1'), Process('process2')
for p in (p1, p2): state_info(p)
print()
transition(p1, p1.wait, WAITING)
transition(p2, p2.terminate, TERMINATED)
for p in (p1, p2): state_info(p)
print()
transition(p1, p1.run, RUNNING)
transition(p2, p2.wait, WAITING)
for p in (p1, p2): state_info(p)
print()
transition(p2, p2.run, RUNNING)
for p in (p1, p2): state_info(p)
print()
for p in (p1, p2): transition(p, p.block, BLOCKED)
for p in (p1, p2): state_info(p)
print()
for p in (p1, p2): transition(p, p.terminate, TERMINATED)
for p in (p1, p2): state_info(p)
if __name__ == '__main__':
main()