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