狀態設計模式

来源:http://www.cnblogs.com/hyper99/archive/2016/01/04/zhuang-tai-she-ji-mo-shi.html
-Advertisement-
Play Games

五種狀態模式:終極鉤子提醒者延遲事件正交組件轉換到歷史1.終極鉤子模式俗語:老爸對兒子說,你可以按你的特殊方式去做事,但如果你不做,我會做。目的:公共的處理功能放到父狀態,並可以在子狀態中重載,以實現特殊的功能。為什麼叫終極鉤子,因為如果子狀態不處理,總會在父狀態中得到處理,是個終極的處理。問題:父...


五種狀態設計模式:

  • 終極鉤子模式
  • 提醒者模式
  • 延遲事件模式
  • 正交組件模式
  • 轉換到歷史模式

1.終極鉤子模式

俗語:老爸對兒子說,你可以按你的特殊方式去做事,但如果你不做,我會做。

目的:公共的處理功能放到父狀態,並可以在子狀態中重載,以實現特殊的功能。為什麼叫終極鉤子,因為如果子狀態不處理,總會在父狀態中得到處理,是個終極的處理。

問題:父狀態提供公共一致的事件處理方式,如在GUI設計中,提供一致的界面樣式,為所有的子狀態提供預設的一致界面,如果需要,子狀態也可以重載預設的事件處理方式。

解決方案:使用差異化編程,公共的事件處理放到父狀態中,子狀態中重載特殊行為。子狀態(specific)中的A事件處理重載了父狀態A事件處理,子狀態中的A事件處理就是特殊的事件處理。如果某個子狀態不處理A,則在父狀態中處理A。

圖1.終極鉤子模式

2.提示器模式

俗語:我閑的時候,你通知我做,我就做;我在做事的時候,你就不能通知我了,等我閑時再說。

目的:產生一個事件,併發送給自身,以使狀態圖拓撲更加靈活。

問題:在狀態建模時,一些相關的功能耦合太強,用提示器模式,可以解耦。如定時查詢感測器功能與處理數據功能,當查詢到感測器接完數據時,通過發送一個提示事件讓處理數據功能進行處理。

圖2. 兩個功能模塊

解決方案:兩個功能設計為一個層次狀態機結構,查詢功能設計到父狀態中,處理功能設計到子狀態中,用一個提示器事件(DATA_READY),提示處理功能來處理查詢感測器的得到的數據。

圖3. 提示器模式

可以用提示器模式把一個長任務分解為多個小任務來執行。

3.延遲事件模式

俗語:我很忙,有事我先記下,我閑時,我再按我記下的去做。

目的:通過修改事件的順序來簡化狀態機。用於處理事務。

問題: 當前正在處理一個事務時,因事務是原子性的,不可分割的,這時要是來了新的事件,可能會破壞事務處理的原子性。如ATM終端。

解決方案: 在處理事務時,接收事件並保存到本地隊列中,當本事務處理完時再從本地隊列中召回保存的事件。

圖4. 延遲事件模式

4.正交組件模式

俗語:雖然你是你,我是我,但你聽我的沒錯。

目的:把狀態機做為一個組件來使用,把原來正交區域的獨立關係轉化為主-從關係。

問題: 許多對象包含相對獨立的具有狀態行為的部分,在UML狀態圖中實現方式是,把這種鬆散關聯的功能放到獨立的正交區域,而採用正交區域的解決方法,成本較高。如鬧鐘的功能實現。

解決方案: 使用對象合成來代替正交區域,把行為獨立的兩部分分成兩個狀態機,其中一個包含另一個。正交區域的兩個對象,使一個對象成為容器,包含另一個組件對象,由容器對象負責對組件對象的初始化及調用。通過直接向組件派發事件,容器可以主動觸發組件初始化和狀態轉換;而組件是通過發送事件給容器來通知容器的。

圖5. 正交組件模式

5.轉換到歷史模式

俗語: 我在工作中,當有更重要的事時,我馬上去做,做完後,我會回到我被中斷工作前的狀態。

目的:從某個組合狀態轉換出來時,記住最近的活動子狀態,在返回時,還返回到這個活動子狀態。

問題:在高層組合狀態處理事件時,常常需要處理一些更重要的事件,當處理完時,系統必須返回組合狀態最近的子狀態。

解決方案: 在組合狀態機的屬性中加一個狀態函數變數xxx_history,在狀態機進入某狀態時,保存當前狀態到這個狀態函數變數中。在退出組合狀態後返回時,按照保存在狀態函數變數值,轉換到最後退出組合狀態前的狀態。

圖6.轉換到歷史模式

參考:
【1】Miro Samek《UML狀態圖的實用C/C++設計---嵌入式系統的事件驅動型編程技術》第二版


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • - check-rpaths的問題 今天在編譯varnish的時候,遇到幾個問題,其中一個就是出現如下錯誤:...+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot************************************....
  • 安裝參見: https://github.com/oetiker/SmokePing/blob/master/doc/smokeping_install.pod 1 Smokeping 2 3 *** General *** 4 5 owner = Ctry 6 contact...
  • 發現伺服器的cpu使用率特別高排查思路:-使用top或者mpstat查看cpu的使用情況# mpstat -P ALL 2 1Linux 2.6.32-358.el6.x86_64 (linux—host) 01/05/2016 _x86_64_ (24 CPU)04:41:13 PM CPU...
  • USB 設備驅動:一、USB 描述符:(存在於USB 的E2PROM裡面)1、 設備描述符:struct usb_device_descriptor2、 配置描述符:struct usb_config_descriptor3、 介面描述符:struct usb_interface_descripto...
  • 英文原文:What really happens when you navigate to a URL,編譯:寒冬星空作為一個軟體開發者,你一定會對網路應用如何工作有一個完整的層次化的認知,同樣這裡也包括這些應用所用到的技術:像瀏覽器,HTTP,HTML,網路伺服器,需求處理等等。本文將更深入的研究...
  • 組內準備搭建內部yum源,在這之前需要規範軟體的安裝目錄,並把現有的應用打包。目前接觸兩種rpm打包工具,rpmbuild和fpm。-rpmbuild rpmbuild關鍵是spec文件編寫。 環境搭建yum -y install rpm-build rpmdevtoolsuseradd rpm;....
  • 30號發現自己機房的另外一條業務線的一臺伺服器流量特別的高(單台伺服器出口流量超過900M),進入伺服器特別慢,由於流量的影響業務的訪問情況。懷疑這台linux伺服器應該中木馬了,於是緊急措施先將伺服器的WAN口宕掉,然後進行如下排查:1、病毒木馬排查。1.1、使用netstat查看網路連接,分析是...
  • linux網路流量實時監控工具之iptrafIPTraf是一個網路監控工具,功能比nload更強大,可以監控所有的流量,IP流量,按協議分的流量,還可以設置過濾器等,如下圖對監控網路來說,這個更適合也更強大,但在總的流量顯示上,沒nload直觀和方便官網及下載 http://iptraf.seul....
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...