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

大话设计模式

设计模式------状态模式

状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化

(当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变他的行为)

python 复制代码
#!/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)
python 复制代码
#!/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
python 复制代码
#!/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
python 复制代码
#!/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()
相关推荐
海绵宝宝转agent8 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭8 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
每天都要写算法(努力版)8 小时前
【行业前沿报告】DAgger:让智能体在自己走到的状态上学习
人工智能·学习·机器学习
小小龙学IT8 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_962071579 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境10 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路10 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师10 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师10 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
Zootopia62610 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信