2026/6/28 17:31:35
网站建设
项目流程
免费刷赞网站推广qq免费,网站右侧返回顶部,青岛中嘉建设集团网站,华大基因 网站建设Python 中的状态模式#xff08;State Pattern#xff09;
状态模式是一种行为型设计模式#xff0c;其核心目的是#xff1a; 允许一个对象在其内部状态改变时改变它的行为。从外部看#xff0c;就像对象改变了其类一样。
形象比喻#xff1a;就像人的心情——开心时会…Python 中的状态模式State Pattern状态模式是一种行为型设计模式其核心目的是允许一个对象在其内部状态改变时改变它的行为。从外部看就像对象改变了其类一样。形象比喻就像人的心情——开心时会笑、生气时会生气、疲惫时会休息。同一人上下文对象因为内部状态不同行为完全不同。状态模式的优点消除庞大的条件判断语句if-elif-else将每个状态的行为局部化到各自的类中符合单一职责原则状态转换显式化更容易理解和管理状态迁移规则易于扩展新状态新增状态只需新增类不修改原有代码对象行为随状态动态变化非常灵活典型应用场景订单状态机待支付 → 已支付 → 发货中 → 已完成 → 退款TCP 连接状态LISTEN → SYN_SENT → ESTABLISHED → CLOSED游戏角色状态正常、攻击、中毒、眩晕、无敌工作流引擎审批流程UI 控件状态启用、禁用、悬停、焦点Python 实现示例订单状态机fromabcimportABC,abstractmethod# 上下文Context持有当前状态classOrder:def__init__(self):self.statePendingPaymentState(self)# 初始状态待支付self.order_idORD12345defset_state(self,state):self.statestateprint(f订单{self.order_id}状态变更为:{state.__class__.__name__})defpay(self):self.state.pay()defship(self):self.state.ship()defcomplete(self):self.state.complete()defrefund(self):self.state.refund()def__str__(self):returnf订单{self.order_id}[{self.state.__class__.__name__}]# 抽象状态StateclassOrderState(ABC):def__init__(self,order:Order):self.orderorderabstractmethoddefpay(self):passabstractmethoddefship(self):passabstractmethoddefcomplete(self):passabstractmethoddefrefund(self):pass# 具体状态1待支付classPendingPaymentState(OrderState):defpay(self):print(支付成功)self.order.set_state(PaidState(self.order))defship(self):print(错误订单尚未支付无法发货)defcomplete(self):print(错误订单尚未支付无法完成)defrefund(self):print(错误订单尚未支付无法退款)# 具体状态2已支付classPaidState(OrderState):defpay(self):print(错误订单已支付无需重复支付)defship(self):print(开始发货...)self.order.set_state(ShippedState(self.order))defcomplete(self):print(错误订单尚未发货无法完成)defrefund(self):print(退款处理中...)self.order.set_state(RefundingState(self.order))# 具体状态3已发货classShippedState(OrderState):defpay(self):print(错误订单已支付)defship(self):print(错误订单已发货无需重复发货)defcomplete(self):print(订单已签收交易完成)self.order.set_state(CompletedState(self.order))defrefund(self):print(发货后退款需审核...)# 可以转到另一个状态或保持当前# 具体状态4已完成classCompletedState(OrderState):defpay(self):print(订单已完成)defship(self):print(订单已完成)defcomplete(self):print(订单已完成)defrefund(self):print(已完成订单不支持退款)# 具体状态5退款中classRefundingState(OrderState):defpay(self):print(退款中...)defship(self):print(退款中...)defcomplete(self):print(退款中...)defrefund(self):print(退款处理完成)# 可以转到 RefundedState 等# 客户端使用if__name____main__:orderOrder()print(order)order.pay()# → PaidStateprint(order)order.ship()# → ShippedStateprint(order)order.complete()# → CompletedStateprint(order)print(\n--- 尝试非法操作 ---)order.pay()# 已支付再支付报错order.refund()# 已完成不支持退款输出订单 ORD12345 [PendingPaymentState] 支付成功 订单 ORD12345 状态变更为: PaidState 订单 ORD12345 [PaidState] 开始发货... 订单 ORD12345 状态变更为: ShippedState 订单 ORD12345 [ShippedState] 订单已签收交易完成 订单 ORD12345 状态变更为: CompletedState 订单 ORD12345 [CompletedState] --- 尝试非法操作 --- 错误订单已支付无需重复支付 已完成订单不支持退款Pythonic 简化版使用字典 函数适合简单状态机当状态不多、行为简单时可以避免创建多个类classSimpleOrder:def__init__(self):self.statependingself.states{pending:{pay:lambda:self.transition(paid),ship:lambda:print(不能发货),},paid:{pay:lambda:print(已支付),ship:lambda:self.transition(shipped),refund:lambda:self.transition(refunding),},shipped:{complete:lambda:self.transition(completed),},completed:{pay:lambda:print(已完成),refund:lambda:print(不支持退款),},}deftransition(self,new_state):print(f状态变更为:{new_state})self.statenew_statedefaction(self,cmd):handlerself.states.get(self.state,{}).get(cmd)ifhandler:handler()else:print(f当前状态{self.state}不支持操作{cmd})# 使用orderSimpleOrder()order.action(pay)order.action(ship)order.action(complete)状态模式结构总结角色说明Context上下文Order持有当前状态引用State抽象状态接口OrderStateConcreteState具体状态类PendingPaymentState 等状态模式 vs 策略模式对比模式目的切换时机典型场景状态行为随内部状态改变运行时自动切换订单、TCP、游戏角色策略行为算法可外部替换外部手动设置支付方式、排序算法关键区别状态模式中状态对象自己决定下一个状态内部驱动策略模式中客户端决定使用哪个策略外部驱动。Python 中的实用建议复杂状态机使用类实现状态模式清晰、可维护简单状态用枚举 字典映射行为结合枚举更安全fromenumimportEnumclassOrderStatus(Enum):PENDINGpendingPAIDpaidSHIPPEDshippedCOMPLETEDcompletedclassOrder:def__init__(self):self.statusOrderStatus.PENDING真实项目中常见Django 的模型状态字段 状态迁移Celery 任务状态游戏引擎中的角色状态系统注意事项状态类不要太多否则维护困难确保所有状态都实现了完整接口避免遗漏操作状态转换逻辑要集中管理避免分散在多个地方状态模式是构建复杂状态机的最佳实践之一能让状态逻辑清晰、可扩展、可测试。如果你想看更高级的例子如游戏角色多状态叠加、带超时自动转状态、工作流引擎实现或者如何与备忘录模式结合实现状态快照欢迎继续问