python常见的设计模式,python状态机设计模式
本文主要详细介绍Python设计模式中的状态模式。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。
00-1010状态模式应用场景代码示例摘要
目录
模式,该模式允许对象在其内部状态发生变化时执行不同的进程。
优点:
封装状态转换规则。枚举可能的状态。在枚举状态之前,您需要确定状态的种类。将与某个状态相关的所有行为放在一个类中,可以方便地添加新的状态。你只需要改变对象的状态来改变对象的行为。允许状态转换逻辑与状态对象集成在一起,而不是一个巨大的条件语句块。多个环境对象可以共享一个状态对象,从而减少系统中的对象数量。缺点:
状态的使用将不可避免地增加系统类和对象的数量。模式的结构和实现是复杂的,使用不当会导致程序结构和代码的混乱。状态对开闭原理来说不是很好。对于可以切换状态的状态模式,添加新的状态类需要修改负责状态转换的人的源代码,否则无法切换到新的状态,修改一个状态类的行为也需要修改相应类的源代码。
状态模式
随着行为的改变而改变的场景。条件语句和分支语句的替代。
应用场景
这是一个状态图,有四种状态:有25美分,没有25美分,糖果售出,糖果售完。同时也对应四个动作:投入25美分,返还25美分,转动曲柄,发放糖果。
类别状态:
#定义状态基类
def insert_quarter(自身):
及格
def eject_quarter(self):
及格
def turn_crank(自身):
及格
def分配(自助):
及格
班级销售状态(州):
#继承State类
def __init__(self,gumball_machine):
self . gumball _ machine=gumball _ machine
def __str__(self):
返回“售完”
def insert_quarter(自身):
打印(“你不能插入25美分硬币,机器已经卖完了”)
def eject_quarter(self):
打印(“你不能弹出,你还没有插入硬币”)
def turn_crank(自身):
印刷(“你转身了,但没有口香糖”)
def分配(自助):
打印(“没有分发口香糖”)
类SoldState(州):
#继承State类
def __init__(self,gumball_machine):
self . gumball _ machine=gumball _ machine
def __str__(self):
退货“售出”
def insert_quarter(自身):
print(请稍等,我们已经在给你口香糖了)
def eject_quarter(self):
公共关系
int("Sorry, you already turned the crank")
def turn_crank(self):
print("Turning twice doesnt 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_state
class 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 havent insert a quarter")
def turn_crank(self):
print("You turned, but theres 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 cant 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)
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT软件开发工作室的更多内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。