• python学习 - 设计模式 - 状态模式


    大话设计模式
    设计模式——状态模式
    状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
    应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
    (当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变他的行为)

    #!/usr/bin/python
    # -*- coding:UTF-8 -*-
    # @File    : d1.py
    # @Software: PyCharm
    
    """场景上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬"""
    """面向过程的方式-方法版"""
    
    class MyType:
        def __init__(self):
            self.type = []
            self.flag = False
    
        def main(self,time,WokerType=False):
            if time < 12:
                print "当前时间{%s}点,上午工作,精神百倍" % time
            elif time < 13:
                print "当前时间{%s}点,饿了,午饭,犯困,午休." % time
            elif time < 17:
                print "当前时间{%s}点,饿了,下午状态还不错,继续努力." % time
            else:
                if WokerType:
                    print "当前时间{%s}点,下班回家." % time
                else:
                    if time < 21:
                        print "当前时间{%s}点,加班中.非常疲劳" % time
                    else:
                        print "当前时间{%s}点,完蛋了,睡着了!!" % time
    
    
    if __name__ == '__main__':
        mytype = MyType()
        mytype.main(12)
    
    
    #!/usr/bin/python
    # -*- coding:UTF-8 -*-
    # @File    : d2.py
    # @Software: PyCharm
    """分类版"""
    """
    1.方法过长坏味道! 违反单一职责,有很多判断责任太大了!
    2.假如:要求所有人必须在二十点之前离开公司改动风险很大,违反开放-封闭原则
    """
    
    
    class Woker:
        def __init__(self, times, WokerType):
            self.__times = times
            self.__WokerType = WokerType
    
        def WriteProgram(self):
            def main(self, time, WokerType=False):
                if time < 12:
                    print "当前时间{%s}点,上午工作,精神百倍" % time
                elif time < 13:
                    print "当前时间{%s}点,饿了,午饭,犯困,午休." % time
                elif time < 17:
                    print "当前时间{%s}点,饿了,下午状态还不错,继续努力." % time
                else:
                    if WokerType:
                        print "当前时间{%s}点,下班回家." % time
                    else:
                        if time < 21:
                            print "当前时间{%s}点,加班中.非常疲劳" % time
                        else:
                            print "当前时间{%s}点,完蛋了,睡着了!!" % time
    
    
    if __name__ == '__main__':
        pass
    
    
    #!/usr/bin/python
    # -*- coding:UTF-8 -*-
    # @File    : d3.py
    # @Software: PyCharm
    """"""
    """
    状态模式(State): 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了类
    主要解决:状态模式主要解决的是一个对象的状态转换条件的表达式过于复杂的情况.把转台的判断逻辑转移到标识不用状态的一系列类中(或者方法中),
    可以吧复杂的判断逻辑简化,
    注:如果这个判断逻辑很简单,那么就没有必要使用状态模式了!!!
    """
    
    from abc import *
    import collections  # 有序字典
    
    
    class Context:
        def __init__(self):
            self.hour = 9
            self.curr = ConcreteStateA()
    
        @property
        def state(self):
            return self.state
    
        @state.setter
        def set_state(self, s):
            self.curr = s
    
        def Request(self):
            self.curr.Handel(self)
    
    
    class State:
        __metaclass__ = ABCMeta
    
        def __init__(self):
            pass
    
        @abstractmethod
        def Handel(self, context): pass
    
    
    class ConcreteStateA(State):
        def Handel(self, context):
            print "这里是状态A"
            context.curr = ConcreteStateB()
            context.hour = 12
    
    
    class ConcreteStateB(State):
        def Handel(self, context):
            print "这里是状态B"
            context.curr = ConcreteStateA()
            context.hour = 21
    
    
    if __name__ == '__main__':
        context = Context()
        context.hour = 9
        context.Request()
        context.Request()
        context.Request()
        print context.hour
        # d1 = {}
        # d1 = collections.OrderedDict()  # 将普通字典转换为有序字典
        # d1['a'] = 'A'
        # d1['b'] = 'B'
        # d1['c'] = 'C'
        # d1['d'] = 'D'
        # for k, v in d1.items():
        #     # print k, v
        #     pass
        #
        # d2 = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}
        # for k, v in d2.items():
        #     print k, v
    
    
    #!/usr/bin/python
    # -*- coding:UTF-8 -*-
    # @File    : cp4.py
    # @Software: PyCharm
    
    # !/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    __author__ = 'Andy'
    """
    大话设计模式
    设计模式——状态模式
    状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
    应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
    (当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变他的行为)
    """
    
    
    class State(object):
        def __init__(self):
            pass
    
        def write_program(self, w):
            pass
    
    
    class Work(object):
        def __init__(self):
            self.hour = 9
            self.curr = ForenoonState()
    
        def set_state(self, s):
            self.curr = s
    
        def write_program(self):
            self.curr.write_program(self)
    
    
    class ForenoonState(State):
        def write_program(self, w):
            if w.hour < 12:
                print "当前时间:%s点," % w.hour, "精神百倍"
            else:
                w.set_state(AfternoonState())
                w.write_program()
    
    
    class AfternoonState(State):
        def write_program(self, w):
            if w.hour < 17:
                print "当前时间:%s点," % w.hour, "状态还行,继续努力"
            else:
                w.set_state(EveningState())
                w.write_program()
    
    
    class EveningState(State):
        def write_program(self, w):
            if w.hour < 21:
                print "当前时间:%s点," % w.hour, "加班呢,疲劳了"
            else:
                w.set_state(SleepState())
                w.write_program()
    
    
    class SleepState(State):
        def write_program(self, w):
            print "当前时间:%s点," % w.hour, "不行了,睡着了"
    
    
    if __name__ == "__main__":
        work = Work()
        work.hour = 9
        work.write_program()
    
        # work.hour = 15
        # work.write_program()
        # work.hour = 20
        # work.write_program()
        # work.hour = 22
        # work.write_program()
    
    
  • 相关阅读:
    【Vue】响应式与数据劫持
    Linux进程信号
    嵌入式项目分享| 终极智能手表,全过程+全开源分享
    gbase 8a 基础语法概念问题
    HBase学习笔记(一)
    在线数据库结构设计,可以生成CRUD代码
    Vue生命周期
    day4作业
    Debian 11.5.0 安装流程
    2023版 STM32实战6 输出比较(PWM)包含F407/F103方式
  • 原文地址:https://blog.csdn.net/weixin_tank88921/article/details/139963850