欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > python学习 - 设计模式 - 状态模式

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

2024/10/24 20:13:47 来源:https://blog.csdn.net/weixin_tank88921/article/details/139963850  浏览:    关键词:python学习 - 设计模式 - 状态模式

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

#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : d1.py
# @Software: PyCharm"""场景上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬"""
"""面向过程的方式-方法版"""class MyType:def __init__(self):self.type = []self.flag = Falsedef main(self,time,WokerType=False):if time < 12:print "当前时间{%s}点,上午工作,精神百倍" % timeelif time < 13:print "当前时间{%s}点,饿了,午饭,犯困,午休." % timeelif time < 17:print "当前时间{%s}点,饿了,下午状态还不错,继续努力." % timeelse:if WokerType:print "当前时间{%s}点,下班回家." % timeelse:if time < 21:print "当前时间{%s}点,加班中.非常疲劳" % timeelse:print "当前时间{%s}点,完蛋了,睡着了!!" % timeif __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 = timesself.__WokerType = WokerTypedef WriteProgram(self):def main(self, time, WokerType=False):if time < 12:print "当前时间{%s}点,上午工作,精神百倍" % timeelif time < 13:print "当前时间{%s}点,饿了,午饭,犯困,午休." % timeelif time < 17:print "当前时间{%s}点,饿了,下午状态还不错,继续努力." % timeelse:if WokerType:print "当前时间{%s}点,下班回家." % timeelse:if time < 21:print "当前时间{%s}点,加班中.非常疲劳" % timeelse:print "当前时间{%s}点,完蛋了,睡着了!!" % timeif __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 = 9self.curr = ConcreteStateA()@propertydef state(self):return self.state@state.setterdef set_state(self, s):self.curr = sdef Request(self):self.curr.Handel(self)class State:__metaclass__ = ABCMetadef __init__(self):pass@abstractmethoddef Handel(self, context): passclass ConcreteStateA(State):def Handel(self, context):print "这里是状态A"context.curr = ConcreteStateB()context.hour = 12class ConcreteStateB(State):def Handel(self, context):print "这里是状态B"context.curr = ConcreteStateA()context.hour = 21if __name__ == '__main__':context = Context()context.hour = 9context.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):passdef write_program(self, w):passclass Work(object):def __init__(self):self.hour = 9self.curr = ForenoonState()def set_state(self, s):self.curr = sdef 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 = 9work.write_program()# work.hour = 15# work.write_program()# work.hour = 20# work.write_program()# work.hour = 22# work.write_program()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com