状态模式设计思想
一个事物有多种状态,在不同的状态下表现出不同的行为和属性
状态模式模型框架 --- 摘自 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设计模式之 --- 状态模式的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did165109