python设计模式之状态设计模式
来源:互联网 发布:订单号生成算法 编辑:程序博客网 时间:2024/05/21 09:59
一、定义状态设计模式
1.理解状态设计模式
1.1主要参与者
State:封装对象行为接口。行为与对象的状态相关联。
ConcreState: State接口的子类,实现与对象特定状态相关联的实际行为。
Context:定义客户感兴趣的接口。维护了一个ConcreState子类的示例,该子类内部定义了对象的特定状态的实现。
1.2代码
# -*- coding: UTF-8 -*-from abc import ABCMeta,abstractmethodclass State(): @abstractmethod def Handle(self): passclass ConcreteStateB(State): def Handle(self): print ("ConcreteStateB")class ConcreteStateA(State): def Handle(self): print ("ConcreteStateA")class Context(State): def __init__(self): self.state = None def getState(self): return self.state def setState(self,state): self.state = state def Handle(self): self.state.Handle()context = Context()stateA = ConcreteStateA()StateB = ConcreteStateB()context.setState(stateA)context.Handle()
2.UML图
State:这个定义了Handle()抽象方法的接口,Handle()方法需要通过ConcreateState类来实现。
ConcreateStateA和ConcreateStateB。他们都实现了Handle()方法,并且可以根据状态的变化定义要采取的实际行动。
Context:这个是接受客户请求的类。它还维护着对象当前状态的引用,这样,就可以根据相应的请求,来调用具体的行为了。
二、状态设计模式的简单示例
1.按钮控制电视
# -*- coding: UTF-8 -*-from abc import ABCMeta,abstractmethodclass State(): @abstractmethod def doThis(self): passclass StartState(State): def doThis(self): print ("TV Switching ON...")class StopState(State): def doThis(self): print ("TV Switching OFF...")class TVContext(State): def __init__(self): self.state = None def getState(self): return self.state def setState(self,state): self.state = state def doThis(self): self.state.doThis()context = TVContext()context.getState()start = StartState()stop = StopState()context.setState(stop)context.doThis()
2.计算机开机、关机、休眠
# -*- coding: UTF-8 -*-from abc import ABCMeta,abstractmethodclass ComputerState(object): name = "State" allowed = [] def switch(self,state): if state.name in self.allowed: print ("Current:",self,"-->switch to new state",state.name) self.__class__ = state else: print ("Current:",self,"-->switch to ",state.name,"no possible") self.__class__ = state def __str__(self): return self.nameclass Off(ComputerState): name = "off" allowed = ["on"]class On(ComputerState): name = "on" allowed = ["off","suspend","hibernate"]class Suspend(ComputerState): name = "suspend" allowed = ["on"]class Hibernate(ComputerState): name = "hibernate" allowed = ["on"]class Computer(object): def __init__(self, model = "HP"): self.model = model self.state = Off() def change(self,state): self.state.switch(state)if __name__ == "__main__": comp = Computer() # Switch on comp.change(On) # Switch off comp.change(Off) # Switch on again comp.change(On) # Suspend comp.change(Suspend) # Try to hibernate - cannot ! comp.change(Hibernate) # switch on back comp.change(On) # Finally off comp.change(Off)
三、状态模式的优缺点
1.优点
1.1 对象的行为是器状态的函数结果,并且行为在运行时根据状态而改变。
1.2 使用状态模式,实现多台行为,并且易于添加状态来支持额外的行为。
1.3 状态设计模式提高了聚合性。
1.4 使用状态模式添加ConcreateState 十分容易,改善了应用程序行为的灵活性,全面提高了代码的可维护性。
2.缺点
2.1 类爆炸:创建的类太多,增加代码量。
2.2 每引入一个行为,需要Context类都需要进行相应的更新处理每个行为。这使得上下文行为更容易受到每个新的行为的影响。