Python设计模式中的状态模式是什么
Python设计模式中的状态模式是什么
这篇文章将为大家详细讲解有关Python设计模式中的状态模式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
状态模式
状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。
优点:
封装了状态转换规则。
枚举了可能的状态,在枚举状态之前需要确定状态的种类。
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点:
状态模式的使用必然会增加系统类和对象的个数。
状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
状态模式对 “开闭原则” 并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
应用场景
行为随状态改变而改变的场景。
条件、分支语句的代替者。
代码示例
这是一个状态图,具有 “有 25 分钱”、“没有 25 分钱”、“售出糖果”、“糖果售罄” 这 4 个状态。同时也对应 4 个动作:“投入 25 分钱”,“退回 25 分钱”,“转动曲柄” 和 “发放糖果”。
classState:#定义state基类definsert_quarter(self):passdefeject_quarter(self):passdefturn_crank(self):passdefdispense(self):passclassSoldOutState(State):#继承State类def__init__(self,gumball_machine):self.gumball_machine=gumball_machinedef__str__(self):return"sold_out"definsert_quarter(self):print("Youcan'tinsertaquarter,themachineissoldout")defeject_quarter(self):print("Youcan'teject,youhaven'tinsertedaquarteryet")defturn_crank(self):print("Youturned,buttherarenogumballs")defdispense(self):print("Nogumballdispensed")classSoldState(State):#继承State类def__init__(self,gumball_machine):self.gumball_machine=gumball_machinedef__str__(self):return"sold"definsert_quarter(self):print("Pleasewait,we'realreadygivingyouagumball")defeject_quarter(self):print("Sorry,youalreadyturnedthecrank")defturn_crank(self):print("Turningtwicedoesn'tgetyouanothergumball")defdispense(self):self.gumball_machine.release_ball()ifgumball_machine.count>0:self.gumball_machine.state=self.gumball_machine.no_quarter_stateelse:print("Oops,outofgumballs!")self.gumball_machine.state=self.gumball_machine.soldout_stateclassNoQuarterState(State):#继承State类def__init__(self,gumball_machine):self.gumball_machine=gumball_machinedef__str__(self):return"no_quarter"definsert_quarter(self):#投币并且改变状态print("Youinsertedaquarter")self.gumball_machine.state=self.gumball_machine.has_quarter_statedefeject_quarter(self):print("Youhaven'tinsertaquarter")defturn_crank(self):print("Youturned,butthere'snoquarter")defdispense(self):print("Youneedtopayfirst")classHasQuarterState(State):#继承State类def__init__(self,gumball_machine):self.gumball_machine=gumball_machinedef__str__(self):return"has_quarter"definsert_quarter(self):print("Youcan'tinsertanotherquarter")defeject_quarter(self):print("Quarterreturned")self.gumball_machine.state=self.gumball_machine.no_quarter_statedefturn_crank(self):print("Youturned...")self.gumball_machine.state=self.gumball_machine.sold_statedefdispense(self):print("Nogumballdispensed")classGumballMachine: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)ifcount>0:self.state=self.no_quarter_stateelse:self.state=self.soldout_statedef__str__(self):return">>>Gumballmachinecurrentstate:%s"%self.statedefinsert_quarter(self):#投入25分钱self.state.insert_quarter()defeject_quarter(self):#退回25分self.state.eject_quarter()#print("state",self.state,type(self.state))defturn_crank(self):#转动曲柄#print("state",self.state,type(self.state))self.state.turn_crank()defrelease_ball(self):#发放糖果print("Agumballcomesrollingouttheslot...")ifself.count>0:self.count-=1if__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设计模式中的状态模式是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
推荐阅读
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...
-
Python如何利用D3Blocks绘制可动态交互的图表
-
2021年度编程语言揭晓
-
PPython:PHP 拥抱 Python 的利器
-
哪种Python IDE最适合你?这里有一份优缺点列表
-
Python分隔字符串函数用法split
aaa,bbb=str.split(‘&&’,2)第一个参数为分隔符第二个参数是要完成的最大拆分数...
-
php安全编程——python测试实例编写
-
神奇的Python模块:pdfkit,将Python抓取的网址内容保存pdf文件