状态模式
一个对象在其内部状态改变时改变它的行为
假设滚球兽幼年期(10岁以下)——技能:卖萌
经过一段时间成长,进化为亚古兽(10-30岁)——技能:火球
经过一段时间成长,进化为暴龙兽(30-80岁)——技能:大火球
经过一段时间成长,进化为机械暴龙兽(80-300岁)——技能:毁灭弹
经过一段时间成长,进化为机械暴龙兽(300-1000岁)——技能:能量弹
综上所述,一个对象的行为随着它内部状态的变化而改变了
需要一个父接口约束状态类
需要一个父接口约束实际的对象
python实现
from abc import abstractmethod
class States:
'''
行为类的父类
'''
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
def isMatch(self,age):
return False
@abstractmethod
def behavior(self,context):
pass
def singleton(cls,*args,**kwargs):
instance = {}
def __singletons(*args,**kwargs):
if cls not in instance:
instance[cls] = cls(*args,**kwargs)
return instance[cls]
return __singletons
from abc import ABCMeta
class Content(metaclass=ABCMeta):
'''
对象类的父类,定义了状态与行为相关的属性和方法
'''
def __init__(self):
self.__conlist=[]
self.__cur = None
self.__age = 0
def add(self,state):
if state not in self.__conlist and isinstance(state, States):
self.__conlist.append(state)
def get(self):
if not self.__cur is None:
return self.__cur
else:
print('这个人很懒,他什么也没有留下')
def remove(self,state):
if state in self.__conlist:
self.__conlist.remove(state)
def getAge(self):
return self.__age
def setAge(self,age):
flag = self.__age < age
self.__age = age
for st in self.__conlist:
if(st.isMatch(age)):
self.changeState(st,flag)
def changeState(self,states,flag):
if self.__cur is None:
print('直接进化为 : ',states.getName())
elif flag:
print('由',self.__cur.getName(),'进化为',states.getName())
elif not flag:
print('由',self.__cur.getName(),'退化为',states.getName())
self.__cur = states
@singleton
class GunQiu(States):
'''
具体的行为类——卖萌
'''
def __init__(self):
super().__init__("滚球兽")
def isMatch(self, info):
return info < 10
def behavior(self,context):
print(self.getName(),' 当前年龄为' ,context.getAge(),' , 技能 : 卖萌')
@singleton
class ZhanDou(States):
def __init__(self):
super().__init__("战斗暴龙兽")
def isMatch(self, info):
return info >= 300 and info < 1000
def behavior(self,context):
print(self.getName(),' 当前年龄为' ,context.getAge(),' , 技能 : 能量弹')
s1 = GunQiu()
s2 = YaGu()
s3 = BaoLong()
s4 = JiXie()
s5 = ZhanDou()
baby = Baby()
baby.add(s1)
baby.add(s2)
baby.add(s3)
baby.add(s4)
baby.add(s5)
baby.setAge(23)
baby.behavior()
print('---------------')
baby.setAge(50)
baby.behavior()
print('---------------')
baby.setAge(100)
baby.behavior()
print('---------------')
baby.setAge(500)
baby.behavior()
print('---------------')
baby.setAge(5)
baby.behavior()
print('---------------')
'''
直接进化为 : 亚古兽
亚古兽 当前年龄为 23 , 技能 : 火球
---------------
由 亚古兽 进化为 暴龙兽
暴龙兽 当前年龄为 50 , 技能 : 大火球
---------------
由 暴龙兽 进化为 机械暴龙兽
机械暴龙兽 当前年龄为 100 , 技能 : 毁灭弹
---------------
由 机械暴龙兽 进化为 战斗暴龙兽
战斗暴龙兽 当前年龄为 500 , 技能 : 能量弹
---------------
由 战斗暴龙兽 退化为 滚球兽
滚球兽 当前年龄为 5 , 技能 : 卖萌
---------------
'''