Python 设计模式--状态模式

状态模式

状态模式(State Pattern)是设计模式的一种,属于行为模式。

定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

  状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

意图:允许一个对象在其内部状态改变时改变它的行为

适用场景:

  1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

  2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

类图:

类图

Python代码实现(仿大话设计模式示例):

class State:
    '''
    @summary: 状态父类,用于抽象状态方法,
        +每增加一种状态,只需要增加一个子类,并修改相关状态的跳转
        

        
    @ivar ivar: type
    
    @author: whzhang
    @since: 2011-7-5
    @change: 
    '''
    
    def __init__(self):
        pass
    
    def WriteProgrem(self, w):
        pass
    
class NonnState(State):
    def WriteProgrem(self, w):
        if w.GetHour() < 12:
            print '当前时间:%d, 精神百倍' % w.GetHour()
        else:
            w.SetState(AfterState()) 
            w.WriteProgram()

class AfterState(State):
    def WriteProgrem(self, w):
        if w.GetHour() < 14:
            print '当前时间:%d, 吃午饭' % w.GetHour()
        else:
            w.SetState(EeveningState())
            w.WriteProgram()

class EeveningState(State):
    def WriteProgrem(self, w):
        if w.GetFinish():
            print '当前时间:%d, 睡觉' % w.GetHour()
        else:
            print '当前时间:%d,当日事,当日毕。加班吧' % w.GetHour()
#        if w.GetHour() < 18:
#        else:
#            w.WriteProgram()

class Work:
    def __init__(self):
        self.__hour = None
        self.__state = NonnState()
        self.__finish = False
        
    def GetHour(self):
        return self.__hour
    
    def SetHour(self, h):
        self.__hour = h
    
    def SetState(self, s):
        self.__state = s
    
    def GetFinish(self):
        return self.__finish
    
    def SetFinish(self, f):
        self.__finish = f
        
    def WriteProgram(self):
        self.__state.WriteProgrem(self)

if __name__ == '__main__':
    work = Work()
    
    work.SetHour(10)
    work.WriteProgram()
    
    work.SetHour(13)
    work.WriteProgram()
    
    work.SetHour(19)
    work.WriteProgram()
    
    work.SetHour(21)
    work.SetFinish(True)
    work.WriteProgram()
posted @ 2011-07-06 13:45  文海  阅读(3135)  评论(0编辑  收藏  举报