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类都需要进行相应的更新处理每个行为。这使得上下文行为更容易受到每个新的行为的影响。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 励志段落 描写秋天的段落 环境描写段落 环境描写的段落 场面描写段落 场面描写的段落 优美段落100字摘抄 摘抄优美段落 段落间距怎么设置 段落摘抄大全 描写外貌的段落 人物描写段落 描写环境的段落 精彩段落摘抄大全 描写冬天的段落 优美段落50字摘抄 描写秋风的段落 描写春天的段落 外貌描写的段落 动作描写的段落 美文段落摘抄 摘抄美文段落 好的散文段落 写人的段落摘抄 作文结尾优美段落 作文开头结尾优美段落 段虎躲雨 段虎 段虎乔安娜避雨哪一集 段誉 天龙之段誉 段誉扮演者 替身段誉 段誉草母 段誉王语嫣 段誉扮演 段誉武功 天龙段誉 风流段誉 段誉的老婆 段誉的父亲