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()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/34964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/34964.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/34964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LED顯示屏的點間距越小越好嗎

引言 在LED顯示屏市場日趨成熟的同時&#xff0c;小間距顯示屏成為了許多用戶的首選。然而&#xff0c;點間距真的是越小越好嗎&#xff1f;本文將探討這一問題&#xff0c;并提供全面的選購指南。 點間距&#xff1a;并非越小越好 小間距顯示屏因其精細的顯示效果而備受青睞。…

剪輯如何剪輯制作視頻短視頻剪輯學習怎么學,難嗎?

工欲善其事必先利其器&#xff0c;有一個好的工具能讓你的工作如魚得水&#xff0c;果你想在短視頻中制作精良的視頻&#xff0c;你就考慮電腦制作軟件了。果你想制作精良的視頻&#xff0c;你就考慮電腦制作軟件了。 如何找到剪輯軟件了&#xff1f;你可以直接去軟件的官方。你…

KT6368A-sop8藍牙主機芯片獲取電動車胎壓傳感器數據功能

KT6368A藍牙芯片新增主機模式&#xff0c;掃描周邊的胎壓傳感器&#xff0c;這里扮演的角色就是觀察者。因為測試胎壓傳感器&#xff0c;發現它的廣播模式可發現&#xff0c;不可連接 胎壓傳感器部分的手冊說明如下&#xff0c;關于藍牙部分的協議 實際藍牙芯片收到的數據&…

國密算法SM1 SM2 SM3 SM4 SM9

一、概述 SM1-無具體實現 SM1作為一種對稱加密算法&#xff0c;由于其算法細節并未公開&#xff0c;且主要在中國國內使用&#xff0c;因此在國際通用的加密庫&#xff08;如Bouncy Castle&#xff09;中并不直接支持SM1算法。 SM1算法的具體實現涉及國家密碼管理局的規范&…

Studying-代碼隨想錄訓練營day20| 235.二叉搜索樹的最近公共祖先、701.二叉搜索樹中的插入操作、450.刪除二叉搜索樹中的節點

第二十天&#xff0c;二叉樹part07&#xff0c;二叉樹搜索樹加油加油&#x1f4aa; 目錄 235.二叉搜索樹的最近公共祖先 701.二叉搜索樹中的插入操作 450.刪除二叉搜索樹中的節點 拓展&#xff1a;普通二叉樹的刪除方式 總結 235.二叉搜索樹的最近公共祖先 文檔講解&…

潔凈室(區)浮游菌檢測標準操作規程及GB/T 16292-2010測試方法解讀

潔凈室(區)空氣中浮游菌的檢測。潔凈區浮游菌檢測是一種評估和控制潔凈區(如實驗室、生產車間等)內空氣質量的方法。這種檢測的目的是通過測量空氣中的微生物(即浮游菌)數量&#xff0c;來評估潔凈區的清潔度或污染程度。下面中邦興業小編帶大家詳細看下如何進行浮游菌采樣檢測…

RK3568技術筆記九 編譯Linux詳細介紹

在編譯前需要按照前面的方法始化編譯環境&#xff0c;否則會導致編譯失敗&#xff08;若配置過則無需重復配置&#xff09;。 全自動編譯包含所有鏡像編譯&#xff0c;包括&#xff1a;uboot編譯、Kernel編譯、Recovey編譯、文件系統編譯、編譯完成鏡像的更新與打包。 按照前面…

閱讀筆記——《Large Language Model guided Protocol Fuzzing》

【參考文獻】Meng R, Mirchev M, Bhme M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium (NDSS). 2024.&#xff08;CCF A類會議&#xff09;【注】本文僅為作者個人學習筆記&a…

【附精彩文章合輯】當談到程序的“通用性”與“過度設計”的困境時,我們可以通過一些具體的例子來更直觀地闡述這些解決方案

當談到程序的“通用性”與“過度設計”的困境時&#xff0c;我們可以通過一些具體的例子來更直觀地闡述這些解決方案。以下是一些示例&#xff1a; 一、明確需求與目標 例子1&#xff1a;在線購物平臺 需求分析&#xff1a;平臺需要支持用戶注冊、登錄、瀏覽商品、下單購買、…

2024ciscn 華東北awdp pwn部分wp

pwn1 break 很簡單&#xff0c;棧可執行。 先格式化字符串泄露出棧地址和canary&#xff0c;然后稍稍布置一下打orw就行 沙盒和沒有一樣 from pwn import *context(archamd64, oslinux)if __name__ __main__:# io remote(192.47.1.39, 80)io remote(192.168.142.137, 123…

初階 《操作符詳解》 10. 逗號表達式

10. 逗號表達式 exp1, exp2, exp3, …expN 注&#xff1a; 1.逗號表達式&#xff0c;就是用逗號隔開的多個表達式 2.逗號表達式&#xff0c;從左向右依次執行&#xff0c;整個表達式的結果是最后一個表達式的結果 代碼1 #include <stdio.h> int main() {int a 1;int b…

【Qt6.3 基礎教程 19】 設計直觀用戶界面(UI):Qt應用界面設計原則

文章目錄 前言理解用戶需求界面的簡潔性一致性反饋利用布局管理美化你的應用結論 前言 用戶界面(UI)設計對于任何軟件項目的成功至關重要&#xff0c;因為它是用戶與您的應用之間交流的橋梁。在Qt環境中&#xff0c;擁有一套清晰和直觀的UI設計原則&#xff0c;將有助于您創建…

解決ubuntu18.04 安裝vscode 報依賴庫錯誤,以及打不開終端的問題。

其實很簡單&#xff0c;ubuntu18.04太老了&#xff0c;官網最新版本的vscode對ubuntu18.04會有些依賴庫的問題。 一頓查資料后發現2023.11月的1.85版本正常使用&#xff0c;于是完美解決。 下載鏈接 Visual Studio Code November 2023 點擊這里下載。 下載完成&#xff0c;…

golang 獲取字符串切割之后的最后一個字符串

有些場景需要獲取字符串按某個字符切割之后&#xff0c;獲取最后&#xff0c;有個比較好的實踐分享 strings.LastIndex 如果沒有匹配到&#xff0c;則返回-1 package mainimport ("fmt""strings" )func main() {ss : []string{"", ":&quo…

數據結構需要每個都具體實現嗎?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「數據結構的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;用c的stl能刷算法題是不…

【INTEL(ALTERA)】運行配置找不到導入的自定義 makefile 項目

目錄 說明 解決方法 說明 在使用 Import Custom Makefile 用于Nios II軟件構建工具項目 選項導入項目后&#xff0c;Nios II SBT 無法將導入的自定義 makefile 識別為Nios II C/C 應用項目。因此&#xff0c;項目名稱不出現在運行配置中的列表中。 解決方法 在 "運行配置 …

clean code-代碼整潔之道 閱讀筆記(第十三章)

第十三章 并發編程 "對象是過程的抽象。線程是調度的抽象。" --James O Coplien 13.1 為什么要并發 并發是一種解耦策略。它幫助我們把做什么&#xff08;目的&#xff09;和何時&#xff08;時機&#xff09;做分解開。在單線 程應用中&#xff0c;目的與時機緊密耦…

【OpenCV 圖像處理 Python版】OpenCV 簡介及安裝

文章目錄 1.OpenCV 介紹1.1 OpenCV 的特點1.2 OpenCV 的主要模塊1.3 OpenCV 的應用場景 2.OpenCV-Python 庫3.OpenCV 安裝 1.OpenCV 介紹 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫。它由英特爾公司于1999年…

API的優勢及應用場景(淘寶API測試的詳細步驟)

一、API的優勢 API的出現為應用程序間的通信提供了一種新的方式&#xff0c;它有以下優勢&#xff1a; 1、降低開發難度 開發者可以通過API訪問其他應用程序的數據和功能&#xff0c;避免了重復開發&#xff0c;降低了開發難度。 2、提高開發效率 API提供了一種標準化的通…

Transformer 模型全解析:NLP領域的變革者與任務精粹

標題&#xff1a;Transformer 模型全解析&#xff1a;NLP領域的變革者與任務精粹 引言 Transformer 模型自問世以來&#xff0c;已成為自然語言處理&#xff08;NLP&#xff09;領域的一大突破&#xff0c;其基于自注意力機制的架構為各種語言任務帶來了革命性的進展。本文將…