设计模式——状态模式

状态模式

一个对象在其内部状态改变时改变它的行为

假设滚球兽幼年期(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:#如果当前行为为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  , 技能 : 卖萌
---------------
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值