状态模式可以看作是在运行时改变对象行为的一种方式。
假设有一台笔记本电脑,它有以下几个状态:
首先需要一个行为与对象状态关联的接口
它有两个属性:
它有一个方法:
切换状态的时候会使用self.__class__
将它动态切换到状态对应的对象,这个稍后再看。
class ComputerState(object):
name = "状态"
allowed = []
def switch(self, state):
if state.name in self.allowed:
print(f"状态由「{self}」切换到新的状态「{state.name}」。")
self.__class__ = state
else:
print(f"状态由「{self}」切换到新的状态{state.name}是不可能的。")
def __str__(self):
return self.name
class Off(ComputerState):
name = '关闭'
allowed = ['打开']
class On(ComputerState):
name = '打开'
allowed = ['关闭', '休眠', '挂起']
class Suspemd(ComputerState):
name = '挂起'
allowed = ['打开']
class Hibernate(ComputerState):
name = '休眠'
allowed = ['打开']
class Computer(object):
def __init__(self):
self.state = Off()
def change(self, state):
self.state.switch(state)
一个计算机的初始状态就是关机状态咯,所以实例化的时候把Off()
赋给self.state
if __name__ == '__main__':
computer = Computer()
computer.change(On)
computer.change(Off)
computer.change(On)
computer.change(Suspemd)
computer.change(Hibernate)
computer.change(On)
computer.change(Off)
实例化一下之后,
运行结果
可以通过调试模式来进行学习
将断点创建在self.__class__ = state
这一行上
可以看到等号左侧是Off
,右侧是On
,这样就完成了状态的切换。
状态1
状态2
优点
缺点: