设计模式(状态模式,python语言实现)

基本理论请参考相应书籍,这里直接给实例

基本说明:电梯(Context)内部维护着电梯的运行状态,如在几楼等信息。

                  state是电梯状态的的父类。子类有FloorA(一楼状态),FloorB(二楼状态)FloorC(三楼状态),FloorD(四楼状态)

客户端选择要去的楼层,电梯根据当前的状态决定是需要上行还是需要下行,并判断是否到目的地。

[python] 

# -*- coding: utf-8 -*- 

####################################################### 

#  

# state.py 

# Python implementation of the Class Context 

# Generated by Enterprise Architect 

# Created on:      13-十二月-2012 14:23:46 

#  

####################################################### 

from __future__ import division 

from __future__ import print_function 

from __future__ import unicode_literals 

from future_builtins import * 

class State(object): 

    """This class defines an interface for encapsulating the behaviour associated with

    a particular state of the Context.

    """ 

    m_obj=None 

    def __init__(self, state=0): 

        self.state=state 

        self.current=None 

        self.up=None 

        self.down=None 

        pass 

    def Handle(self,state): 

        if self.state==state: 

            print('第%d' %self.state+'楼到了,请下电梯' ) 

            State.m_obj=self    www.2cto.com

            pass 

        else: 

            self.SetContext() 

            if self.state<state: 

                print('正经过第%d' %self.state+'楼,电梯继续上行') 

                self.current=self.up 

                pass 

            else: 

                print('正经过第%d' %self.state+'楼,电梯继续下行') 

                self.current=self.down 

                pass 

            self.current.Handle(state) 

            pass 

        return State.m_obj 

        pass 

    def SetFloor(self, floor): 

        pass 

    def SetContext(self): 

        pass 

class FloorA(State): 

    """This class defines an interface for encapsulating the behaviour associated with

    a particular state of the Context.

    """ 

    def __init__(self, state=1): 

        super(FloorA,self).__init__(state) 

        pass 

    def SetContext(self): 

        self.up=FloorB() 

        self.down=None        

        pass 

    def SetFloor(self, floor): 

        pass 

class FloorB(State): 

    """This class defines an interface for encapsulating the behaviour associated with

    a particular state of the Context.

    """ 

    def __init__(self, state=2): 

        super(FloorB,self).__init__(state) 

        pass 

    def SetContext(self): 

        self.up=FloorC() 

        self.down=FloorA() 

        pass 

    def SetFloor(self, floor): 

        pass 

class FloorC(State): 

    """This class defines an interface for encapsulating the behaviour associated with

    a particular state of the Context.

    """ 

    def __init__(self, state=3): 

        super(FloorC,self).__init__(state) 

        pass 

    def SetContext(self): 

        self.up=FloorD() 

        self.down=FloorB()         

        pass 

    def SetFloor(self, floor): 

        pass 

class FloorD(State): 

    """This class defines an interface for encapsulating the behaviour associated with

    a particular state of the Context.

    """ 

    def __init__(self, state=4): 

        super(FloorD,self).__init__(state) 

        pass 

    def SetContext(self): 

        self.up=None 

        self.down=FloorC()         

        pass 

    def SetFloor(self, floor): 

        pass 

class Context(object): 

    """This class defines the interface of interest to clients and maintains an

    instance of a ConcreteState subclass that defines the current state.

    """ 

    m_State= State() 

    def __init__(self): 

        Context.m_State=FloorA() 

        pass 

    def SetState(self,state): 

        Context.m_State=state 

        pass 

    def Request(self,floor): 

        # state->Handle() 

        print('电梯在第%d楼'%Context.m_State.state)         

        current=Context.m_State.Handle(floor) 

        if current!=None: 

            self.SetState(current) 

            pass 

        else: 

            print('电梯运行出错') 

            pass 

        print('\n') 

        pass 

    pass 

if(__name__=="__main__"):   

    #建立电梯 

    m_Context= Context() 

    #到四楼  

    m_Context.Request(4) 

    #然后有人到2楼      

    m_Context.Request(2) 

    #然后有人到3楼 

    m_Context.Request(3) 

    #然后有人到1楼 

    m_Context.Request(1)  

运行结果:

posted @ 2013-07-26 17:17  草根儿  阅读(280)  评论(0)    收藏  举报