状态模式

状态模式

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

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

 

posted @ 2018-12-18 13:13  慕沁  阅读(120)  评论(0)    收藏  举报