大话设计模式
设计模式——状态模式
状态模式(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()