python常见的设计模式,python状态机设计模式

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: