大話設計模式
設計模式——狀態模式
狀態模式(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()