好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Python设计模式之 --- 状态模式

  状态模式设计思想

一个事物有多种状态,在不同的状态下表现出不同的行为和属性

状态模式模型框架 --- 摘自 python人人都懂设计模式的书中(感谢大佬)

# 状态模式的框架模型
from abc import ABCMeta,abstractmethod
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
class Context(metaclass=ABCMeta):
    """状态模式的上下文环境类,负责状态的切换"""

    def __init__(self):
        self.__states = []
        # 状态类集合
        self.__curState = None
        # 当前状态
        self.__stateInfo = 0
        # 状态的属性值
    # 添加状态
    def addState(self,state):
        if (state not in self.__states):
            self.__states.append(state)
    # 状态改变
    def changeState(self,state):
        if (state is None):
            return False
        # 判断当前状态是如果是空的话就初始化状态,如果当前状态值有就更新状态
        if (self.__curState is None):
            print("初始化为",state.getName())
        else:
            print("由",self.__curState.getName(),"变为",state.getName())
        self.__curState = state
        self.addState(state)
        return True
    # 返回当前状态
    def getState(self):
        return self.__curState
    # 设置状态属性值
    def _setStateInfo(self,stateInfo):
        self.__stateInfo = stateInfo
        for state in self.__states:
            if (state.isMatch(stateInfo)):
                self.changeState(state)
    # 返回当前状态属性值
    def _getStateInfo(self):
        return self.__stateInfo

class State:
    """状态的基类,负责状态的定义和接口的统一"""
    def __init__(self,name):
        self.__name = name
    # 返回当前状态名称
    def getName(self):
        return self.__name

    def isMatch(self,stateInfo):
        """状态的属性statInfo是否在当前的状态范围内"""
        return False
    # @abstractmethod 抽象方法表示基类的一个方法,没有实现,基类不能实例化 ,子类实现了该抽象方法才能被实例化
    @abstractmethod
    def behavior(self,context):
        pass

3. 模拟工单流转状态

"""
    工单状态流转,工单状态有如下几种状态:
    1. 待处理 --- 发布工单申请后的状态
    2. 处理中 --- 处理工单时的状态
    3. 已处理 --- 处理完成时的状态
    4. 已关闭 --- 处理完成后确认后的关闭的状态
    5. 已撤回 --- 已发起未处理自己撤回的状态
"""
from statemodel import Context,State

class WorkOrder(Context):
    def __init__(self):
        super().__init__()
        self.addState(WaitDetal("待处理"))
        self.addState(Detaling("处理中"))
        self.addState(Detaled("已处理"))
        self.addState(Closed("已关闭"))
        self.addState(Recall("已撤回"))
        self.setWorkOrder(0)

    def getWorkOrder(self):
        return self._getStateInfo()
    
    def setWorkOrder(self,stateInfo):
        self._setStateInfo(stateInfo)
    
    def behavior(self):
        state = self.getState()
        if (isinstance(state,State)):
            state.behavior(self)

def singleton(cls, *args, **kwargs):
    """构造一个单例的装饰器"""
    instance = {}
    def __singleton(*args,**kwargs):
        if cls not in instance:
            instance[cls] = cls(*args,**kwargs)
        return instance[cls]
    return __singleton

@singleton
class WaitDetal(State):
    """待处理"""
    def __init__(self,name):
        super().__init__(name)
    def isMatch(self,stateInfo):
        return stateInfo == 0
    def behavior(self,context):
        print("当前工单状态为:",self.getName())
        print("当前工单状态值是:",context._getStateInfo())

@singleton
class Detaling(State):
    """处理中"""
    def __init__(self,name):
        super().__init__(name)
    def isMatch(self,stateInfo):
        return stateInfo == 1
    def behavior(self,context):
        print("当前工单状态为:",self.getName())
        print("当前工单状态值是:",context._getStateInfo())

@singleton
class Detaled(State):
    """"已处理"""
    def __init__(self,name):
        super().__init__(name)
    def isMatch(self,stateInfo):
        return stateInfo == 2
    def behavior(self,context):
        print("当前工单状态为:",self.getName())
        print("当前工单状态值是:",context._getStateInfo())

@singleton
class Closed(State):
    """"已关闭"""
    def __init__(self,name):
        super().__init__(name)
    def isMatch(self,stateInfo):
        return stateInfo == 3
    def behavior(self,context):
        print("当前工单状态为:",self.getName())
        print("当前工单状态值是:",context._getStateInfo())

@singleton
class Recall(State):
    """"已撤回"""
    def __init__(self,name):
        super().__init__(name)
    def isMatch(self,stateInfo):
        return stateInfo == 4
    def behavior(self,context):
        print("当前工单状态为:",self.getName())
        print("当前工单状态值是:",context._getStateInfo())
def teststate():
    workorder = WorkOrder()
    workorder.behavior()
    workorder.setWorkOrder(1)
    workorder.behavior()
    workorder.setWorkOrder(2)
    workorder.behavior()
teststate()

执行脚本结果如下:

查看更多关于Python设计模式之 --- 状态模式的详细内容...

  阅读:31次