Python设计模式中的状态模式是什么
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章将为大家详细讲解有关Python设计模式中的状态模式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。状态模式状态模式,当对象的内部状态发生了改变的时候,
千家信息网最后更新 2025年02月06日Python设计模式中的状态模式是什么
这篇文章将为大家详细讲解有关Python设计模式中的状态模式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
状态模式
状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。
优点:
封装了状态转换规则。
枚举了可能的状态,在枚举状态之前需要确定状态的种类。
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点:
状态模式的使用必然会增加系统类和对象的个数。
状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
状态模式对 "开闭原则" 并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
应用场景
行为随状态改变而改变的场景。
条件、分支语句的代替者。
代码示例
这是一个状态图,具有 "有 25 分钱"、"没有 25 分钱"、"售出糖果"、"糖果售罄" 这 4 个状态。同时也对应 4 个动作:"投入 25 分钱","退回 25 分钱","转动曲柄" 和 "发放糖果"。
class State: # 定义state基类 def insert_quarter(self): pass def eject_quarter(self): pass def turn_crank(self): pass def dispense(self): passclass SoldOutState(State): # 继承State 类 def __init__(self, gumball_machine): self.gumball_machine = gumball_machine def __str__(self): return "sold_out" def insert_quarter(self): print("You can't insert a quarter, the machine is sold out") def eject_quarter(self): print("You can't eject, you haven't inserted a quarter yet") def turn_crank(self): print("You turned, but ther are no gumballs") def dispense(self): print("No gumball dispensed")class SoldState(State): # 继承State 类 def __init__(self, gumball_machine): self.gumball_machine = gumball_machine def __str__(self): return "sold" def insert_quarter(self): print("Please wait, we're already giving you a gumball") def eject_quarter(self): print("Sorry, you already turned the crank") def turn_crank(self): print("Turning twice doesn't get you another gumball") def dispense(self): self.gumball_machine.release_ball() if gumball_machine.count > 0: self.gumball_machine.state = self.gumball_machine.no_quarter_state else: print("Oops, out of gumballs!") self.gumball_machine.state = self.gumball_machine.soldout_stateclass NoQuarterState(State): # 继承State 类 def __init__(self, gumball_machine): self.gumball_machine = gumball_machine def __str__(self): return "no_quarter" def insert_quarter(self): # 投币 并且改变状态 print("You inserted a quarter") self.gumball_machine.state = self.gumball_machine.has_quarter_state def eject_quarter(self): print("You haven't insert a quarter") def turn_crank(self): print("You turned, but there's no quarter") def dispense(self): print("You need to pay first")class HasQuarterState(State): # 继承State 类 def __init__(self, gumball_machine): self.gumball_machine = gumball_machine def __str__(self): return "has_quarter" def insert_quarter(self): print("You can't insert another quarter") def eject_quarter(self): print("Quarter returned") self.gumball_machine.state = self.gumball_machine.no_quarter_state def turn_crank(self): print("You turned...") self.gumball_machine.state = self.gumball_machine.sold_state def dispense(self): print("No gumball dispensed")class GumballMachine: def __init__(self, count=0): self.count = count # 找出所有状态,并创建实例变量来持有当前状态,然后定义状态的值 self.soldout_state = SoldOutState(self) self.no_quarter_state = NoQuarterState(self) self.has_quarter_state = HasQuarterState(self) self.sold_state = SoldState(self) if count > 0: self.state = self.no_quarter_state else: self.state = self.soldout_state def __str__(self): return ">>> Gumball machine current state: %s" % self.state def insert_quarter(self): # 投入25分钱 self.state.insert_quarter() def eject_quarter(self): # 退回25分 self.state.eject_quarter() # print("state", self.state, type(self.state)) def turn_crank(self): # 转动曲柄 # print("state", self.state, type(self.state)) self.state.turn_crank() def release_ball(self): # 发放糖果 print("A gumball comes rolling out the slot...") if self.count > 0: self.count -= 1 if __name__ == "__main__": # 以下是代码测试 gumball_machine = GumballMachine(5) # 装入5 个糖果 print(gumball_machine) gumball_machine.insert_quarter() # 投入25分钱 gumball_machine.turn_crank() # 转动曲柄 print(gumball_machine) gumball_machine.insert_quarter() #投入25分钱 gumball_machine.eject_quarter() # 退钱 gumball_machine.turn_crank() # 转动曲柄 print(gumball_machine) gumball_machine.insert_quarter() # 投入25分钱 gumball_machine.turn_crank() # 转动曲柄 gumball_machine.insert_quarter() # 投入25分钱 gumball_machine.turn_crank() # 转动曲柄 gumball_machine.eject_quarter() # 退钱 print(gumball_machine)
关于"Python设计模式中的状态模式是什么"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
状态
模式
对象
曲柄
投入
糖果
行为
代码
篇文章
设计模式
设计
个数
场景
更多
条件
源代码
系统
结构
语句
切换
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
如何查询食药监数据库
hp服务器客服电话
苹果未找到服务器主机
党中央 网络安全工作
宝坻区网络安全培训班
新乐租房软件开发
k8s中部署tcp服务器
IPTV监测监管及网络安全
长春软件开发首推吉网传媒好
中标麒麟数据库切换
温州可视化智慧校园软件开发
物联网通信网络安全防护策略
广州办公系统软件开发费用
如何做一个实时微信数据库
第三方数据库运维服务
电脑网络安全防御软件要代码吗
如何做缓存服务器
自己做的服务器
管家婆写着无法为数据库
方舟生存进化服务器最高等级
广州优通网络技术有限公司
软件开发证书神州数码
东莞软件开发兼职
全国网络安全等保测评步骤
数据库安全卫士是什么
北京51网络安全培训
软件开发类证书
网络安全和信息化分别范围
数据库中的html显示
方舟生存进化服务器最高等级