Python设计模式——状体模式

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

#encoding=utf-8
__author__ = ‘[email protected]‘

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__ = ‘[email protected]‘

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的时间来做相应的处理,这种做的好处是十分灵活,每个状态都有自己的判断逻辑。拓展和维护起来都比较方便。

时间: 2024-12-22 17:07:25

Python设计模式——状体模式的相关文章

Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = '[email protected]' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大学生帮你买米' def sweep(self

python设计模式之门面模式

一.结构型设计模式 门面模式与单例模式,工厂模式不同,它是一种结构型模式. 结构型模式描述如何将对象和类组合成更大的结构 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之间的关系. 结构型模式是类和对象模式的综合体.类模式通过继承来描述抽象,从而提供更有用的程序接口,而对象模式描述了如何将对象联系起来从而组合成更大的对象. 二.理解门面设计模式 它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更简单的方式使用子系统. 门面所解决的问题是,

Python 设计模式--简单工厂模式

简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算器 代码: 1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 class Operation: 5 def getResult(self): 6 pass 7 8 class OperationAdd(Operation): 9 def getResul

Python设计模式(11)-状态模式

# coding=utf-8 # *状态模式:一个方法的判断逻辑太长,就不容易修改.方法过长,其本质就是,# * 就是本类在不同条件下的状态转移.状态模式,就是将这些判断分开到各个能# * 表示当前状态的独立类中 class State: def persion_state(self): pass class SomeDay: def __init__(self): self.time = 8 self.current = Breakfast() def set_state(self, temp

Python设计模式(2)-策略模式

# 策略模式和简单工厂模式相比,少了使用switch case 做判断,然后去实例化相应的 # 对象,比简单工厂模式更灵活. 它们代码的区别就在于此处使用了抽象类代替工厂类 # coding=utf-8class DbManager: def __init__(self): pass def operate_db(self): pass class DbInsert(DbManager): def operate_db(self): print '插入操作' class DbDel(DbMana

Python设计模式(9)-外观模式

# /*外观模式:为外界调用提供一个统一的接口,把其他类中需要用到的方法提取# * 出来,由外观类进行调用.然后在调用段实例化外观类,以间接调用需要的# * 方法.这种方式和代理模式有异曲同工之妙.然而,根据迪米特法则,代理# * 模式应该尽可能的为单个对象进行代理.而外观模式更像是从众多类中提取# * 有用的方法而组合成的新类*/ class Invoke1: def methon1(self): print '调用1' class Invoke2: def methon2(self): pr

Python设计模式——模版方法模式

1.模版方法模式 做题的列子: 需求:有两个学生,要回答问题,写出自己的答案 #encoding=utf-8 __author__ = '[email protected]' class StudentA(): def answer1(self): print '题目一:XXXXXX' print '我的答案是:B' def answer2(self): print '题目一:XXXXXX' print '我的答案是:B' class StudentB(): def answer1(self):

Python设计模式(5)-代理模式

# coding=utf-8 # 代理模式:# * 代理类成为实际想调用对象的中间件,可以控制对实际调用对象的访问权限# * 可以维护实际对象的引用 class DbManager: def __init__(self): pass def insert_db(self): pass def del_db(self): pass class DbMge(DbManager): def insert_db(self): print '插入数据' class Proxy(DbManager): de

python 设计模式之策略模式

策略模式的定义: 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 通俗的讲,也就是将那些使用的方法风别封装成独立的类,然后将这一类使用接口统一管理起来,让需要使用这些方法的用户能够随时调用他们. 策略模式的结构 策略模式的使用场景 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为. 一个系统需要动态地在几种算法中选择一种. 策略模式的缺点 1.客户端必须知道所有的策略