Python状态机模式
# Python 状态机模式 (State Machine)# State 协议FSM 类状态转换进入/退出动作守卫条件# 状态机将对象行为封装在不同状态中状态变化时行为随之改变。from abc import ABC, abstractmethodfrom typing import Callable# 状态接口class State(ABC):abstractmethoddef on_enter(self, fsm: OrderFSM) - None: ...abstractmethoddef on_exit(self, fsm: OrderFSM) - None: ...abstractmethoddef handle(self, fsm: OrderFSM, event: str) - None: ...# 具体状态class PendingState(State):def on_enter(self, fsm: OrderFSM) - None:fsm.order.status pendingdef on_exit(self, fsm: OrderFSM) - None: passdef handle(self, fsm: OrderFSM, event: str) - None:if event pay:fsm.transition_to(PaidState())elif event cancel:fsm.transition_to(TerminalState(cancelled))class PaidState(State):def on_enter(self, fsm: OrderFSM) - None:fsm.order.status paiddef on_exit(self, fsm: OrderFSM) - None: passdef handle(self, fsm: OrderFSM, event: str) - None:if event ship:fsm.transition_to(ShippedState())elif event refund:fsm.transition_to(TerminalState(refunded))class ShippedState(State):def on_enter(self, fsm: OrderFSM) - None:fsm.order.status shippeddef on_exit(self, fsm: OrderFSM) - None: passdef handle(self, fsm: OrderFSM, event: str) - None:if event deliver:fsm.transition_to(TerminalState(delivered))class TerminalState(State):def __init__(self, status: str):self._status statusdef on_enter(self, fsm: OrderFSM) - None:fsm.order.status self._statusdef on_exit(self, fsm: OrderFSM) - None: passdef handle(self, fsm: OrderFSM, event: str) - None: pass# 守卫条件class Guard:def __init__(self, condition: Callable[[], bool]):self._condition conditiondef passes(self) - bool:return self._condition()# 有限状态机class Order:status: str pendingclass OrderFSM:def __init__(self, order: Order):self.order orderself._current: State PendingState()self._guards: dict[tuple[type, str], Guard] {}def add_guard(self, st: type, evt: str, g: Guard) - None:self._guards[(st, evt)] gdef transition_to(self, new: State) - None:self._current.on_exit(self)self._current newself._current.on_enter(self)def handle(self, event: str) - None:g self._guards.get((type(self._current), event))if g and not g.passes():raise RuntimeError(守卫阻止了转换)self._current.handle(self, event)if __name__ __main__:order Order(); fsm OrderFSM(order)fsm.handle(pay); print(f状态: {order.status})fsm.handle(ship); print(f状态: {order.status})fsm.handle(deliver); print(f终态: {order.status})