状态模式设计思想
一个事物有多种状态,在不同的状态下表现出不同的行为和属性
状态模式模型框架 --- 摘自 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):
pass3. 模拟工单流转状态
"""
工单状态流转,工单状态有如下几种状态:
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://www.haodehen.cn/did165109