zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Mybatis的传值(四种方式)
    用现有表往另一张表插数据
    eclipse 项目发布到tomcat中(转)
    git 基本使用
    (转) Sping的事务传播
    <mvc:annotation-driven/>浅析
    Python函数参数的五种类型
    使用alembic进行数据库版本管理
    Center OS 7 安装 $$
    Python3.x 配置原生虚拟环境
  • 原文地址:https://www.cnblogs.com/wenhaizhang/p/2099131.html
Copyright © 2011-2022 走看看