zoukankan      html  css  js  c++  java
  • Python设计模式——状体模式

    需求,根据当前的时间,返回工作状态

    #encoding=utf-8
    __author__ = 'kevinlu1010@qq.com'
    
    def get_state(hour):
        if hour>=8 and hour<=12:
            return '上午工作,精神百倍'
        elif hour>12 and hour<=14:
            return '中午工作,困,想午休'
        elif hour>14 and hour<=18:
            return '下午工作,状态不错'
        elif hour>18 and hour<=20:
            return '加班了,状态不太好'
        else:
            return '不行了,要睡觉了'
    if __name__=='__main__':
    
        for hour in (9,11,12,13,14,17,19,22,23):
            print '%d点,'%hour,get_state(hour)

    缺点是,如果状态非常多时,(现在是5种),这段代码将会非常长,所以后期维护就比较困难

    状态模式

    #encoding=utf-8
    __author__ = 'kevinlu1010@qq.com'
    
    from abc import ABCMeta, abstractmethod
    
    
    class State():
        __metaclass__ = ABCMeta
    
        @abstractmethod
        def write_code(self):
            pass
    
    
    class Morning(State):
        def write_code(self, work):
            if work.hour <= 12 and work.hour > 8:
                print '上午工作,精神百倍'
            else:
    
                work.set_status(Noon())
                work.write_code(work)
    
    
    class Noon(State):
        def write_code(self, work):
            if work.hour <= 14 and work.hour>12 :
                print '中午工作,困,想午休'
            else:
                work.set_status(Afternoon())
                work.write_code(work)
    
    
    class Afternoon(State):
        def write_code(self, work):
            if work.hour <= 18 and work.hour>14:
                print '下午工作,状态不错'
            else:
                work.set_status(Eve())
                work.write_code(work)
    
    
    class Eve(State):
        def write_code(self, work):
            if work.hour <= 22 and work.hour>18:
                print '加班了,状态不太好'
            else:
                work.set_status(Night())
                work.write_code(work)
    
    
    class Night(State):
        def write_code(self, work):
            if work.hour <= 8 or work.hour > 22:
                print '不行了,要睡觉了'
            else:
                work.set_status(Morning())
                work.write_code(work)
    
    
    class Work():
        def __init__(self, hour):
            self.hour = hour
            self.state = Morning()
    
        def set_status(self, state):
            self.state = state
    
        def write_code(self, work):
            self.state.write_code(work)
    
    
    if __name__ == '__main__':
        work = Work(10)
        for hour in (9, 11, 12, 13, 14, 17, 19, 22, 23,12):
            work.hour = hour
            print '%d点,' % hour
            work.write_code(work)

    状态模式中,定义一个状态的抽象类,为每一种状态建一个类,类中有一个handle函数(这里是write_code),来根据work的时间来做相应的处理,这种做的好处是十分灵活,每个状态都有自己的判断逻辑。拓展和维护起来都比较方便。

  • 相关阅读:
    __attribute__ 总结
    linux文件夹打包命令
    学习ARM的一些基本知识,个人整理
    备忘录之 —— .bashrc(IC工具篇)
    GitHub的基本使用
    02: SocketServer服务
    01: socket模块
    08: python基础练习题
    07: 高阶函数&异常处理
    06: 面向对象
  • 原文地址:https://www.cnblogs.com/Xjng/p/4044399.html
Copyright © 2011-2022 走看看