【UML用戶指南】-23-對高級行為建模-狀態機

目錄

1、概述

2、狀態

2.1、狀態的組成

3、轉移

3.1、轉移的組成

4、高級狀態和轉移

4.1、進入效應和退出效應

4.2、內部轉移

4.3、do活動

4.4、延遲事件

4.5、子狀態機

5、子狀態

5.1、非正交子狀態

5.2、歷史狀態

5.3、正交子狀態

6、分叉與匯合

7、主動對象

8、常用建模技術

8.1、為對象生命周期建模


使用交互,可以對共同工作的對象群體的行為建模。

使用狀態機,可以對單個對象的行為建模。

狀態機是一個行為,它說明對象在它的生命期中響應事件所經歷的狀態序列以及對那些事件做出的反應。

狀態機對系統的動態方面建模,

描述一個類、一個用況或整個系統的實例的生命期。這些實例可能響應諸如信號、操作或計時這樣的事件。當事件發生時,某些效應將依賴對象的當前狀態而發生。

效應(effect)是對狀態機中的行為執行的規約。效應最后將細化為某些引起對象狀態改變或值的返回的動作的執行。對象的狀態(state)是指對象滿足某些條件、執行某些活動或等待某些事件的一段時間。

可以用兩種方式來可視化執行的動態:

1)一種是強調從活動到活動的控制流(使用活動圖

2)另一種是強調對象可能呈現的狀態和這些狀態之間的轉移(使用狀態圖)。

????????在一個對象的生命期中,可能出現各種各樣的事件,如信號、操作的調用、對象的創建和撤銷、時間的推移或某些條件的改變。

????????在響應這些事件時,對象通過某些動作(某種計算)做出反應,這些動作導致對象狀態改變。

????????可以使用狀態機來對任何建模元素(通常是類、用例,或是整個系統)的行為建模。狀態機可以用狀態圖來可視化。可以關注由事件引發的對象行為,這對反應式系統建模很有用。

1、概述

狀態機 (state machine)是一種行為,它說明對象在它的生命期中響應事件所經歷的狀態序列以及它們對那些事件的響應。

狀態 (state)是指對象的生命期中的條件或狀況,在此期間對象將滿足某些條件、執行某些活動或等待某些事件。

事件 (event)是對一個在時間和空間上占有一定位置的有意義的發生的規約。在狀態機的語境中,一個事件是一個激勵的發生,它能夠觸發一個狀態轉移。

轉移 (transition)是兩個狀態之間的一種關系,它指明對象在第一個狀態中執行一定的動作,并當特定事件發生或特定的條件滿足時進入第二個狀態。

活動 (activity)是狀態機中進行的非原子執行。

動作 (action)是一個可執行的原子計算,它引起模型狀態改變或值的返回。

圖形上,狀態用一個圓角的矩形表示,轉移用一條從源狀態指向新狀態的有向實線表示。

用狀態機能最好地說明對象的行為必須響應異步消息,或者它的當前行為依賴于過去。這包括能夠接收信號的類的實例,其中包括許多主動對象。

可以用狀態機來對接口的行為建模

2、狀態

狀態是對象的生命期中的一個條件或狀況,在此期間對象將滿足某些條件、執行某些活動或等待某些事件。

2.1、狀態的組成

(1)名稱(name)一個將本狀態與其他狀態區分開的文本串;狀態可以是匿名的,即沒有名稱。

(2)進入/退出效應(entry/exit effect)分別為進入和退出該狀態時所執行的動作。

(3)內部轉移(internal transition)不導致狀態改變的轉移。

(4)子狀態(substate)狀態的嵌套結構,包括非正交(順序活動)或正交(并發活動)子狀態

(5)延遲事件(deferred event)指在該狀態下暫不處理,將推遲到該對象的另一個狀態下排隊處理的事件列表。

在對象的狀態機中有兩個可能要定義的特殊狀態。第一個是初始狀態,表示狀態機或子狀態的默認開始位置。初始狀態用一個實心的圓表示。第二個是最終狀態,表示該狀態機或外圍狀態的執行已經完成。最終狀態用一個內部含有一個實心圓的圓圈表示(牛眼睛)。

初始狀態和最終狀態實際上都是偽狀態。它們除了名稱外,都沒有正規狀態的通常部分。

3、轉移

轉移是兩個狀態之間的一種關系,表示對象在某個特定事件發生而且特定的條件滿足時將在第一個狀態中執行一定的動作,并進入第二個狀態。

當狀態發生這樣的轉變時,轉移被稱作激活了。

在轉移激活之前,稱對象處于源狀態;激活后,則稱對象處于目標狀態。

例如,當 tooCold(帶有參數desiredTemp)這樣的事件發生時,Heater可能從Idle狀態轉移到Activating狀態。

3.1、轉移的組成

(1)源狀態(source state)即受轉移影響的狀態,如果一個對象處于源狀態,當該對象接收到轉移的觸發事件而且監護條件(如果有)滿足時,將激活一個離出的轉移。

(2)事件觸發器(event trigger)是一個事件,源狀態中的對象識別了這個事件,則在監護條件滿足的情況下激活轉移。

(3)監護條件(guard condition)是一個布爾表達式,當因事件觸發器的接收而觸發轉移時,對這個布爾表達式求值:若表達式取值為真則激活轉移;若為假則不激活,此時若沒有其他的轉移能被這個事件觸發,則該事件丟失。

(4)效應(effect)是一個可執行的行為(比如動作),它可以直接作用于擁有狀態機的對象,并間接作用于對該對象可見的其他對象。

(5)目標狀態(target state)即在轉移完成后的活動狀態。

一個轉移可能有多個源(在這種情況下,它表示來自多個并發狀態的一個匯合),

也可能有多個目標(在這種情況下,它表示發往多個并發狀態的一個分岔)

可以用一個衍型為send 的依賴來顯式地顯示一個信號發送到的對象,

該依賴的源為狀態,目標為這個對象。

4、高級狀態和轉移

高級特征包括進入效應、退出效應、內部轉移、do 活動和延遲事件

這些特征作為一個文本串顯示在狀態符號的文本分欄內。

4.1、進入效應和退出效應

每當進入一個狀態時,執行某個設置動作;當離開一個狀態時,執行某個清理動作。

在狀態符號中包括一個進入效應(以關鍵字entry標記)和一個退出效應(以關鍵字exit標記

),各自帶有一個適當的動作。每當進入該狀態時,就執行它的進入動作;每當離開該狀態時,就執行它的退出動作。

4.2、內部轉移

一旦處于一個狀態內,將遇到想在不離開該狀態的情況下處理的事件,這被稱為內部轉移(internal
?transition)。它通過執行一個效應來響應事件,但不改變狀態。而且不執行進入或退出動作。

關鍵字 entry、exit和 do都是保留字,不能用作事件的名字。

4.3、do活動

當對象處于一個狀態時,它一般是空閑的,在等待著一個事件的發生。希望對一個持續的活動建模。在處于一個狀態的同時,對象做著某些工作,并一直繼續直到被一個事件所中斷。

4.4、延遲事件

在3.1圖中,假定只有一個離開這個狀態、并由事件contact觸發的轉移。當處于Tracking狀態時,除了事件contact和那些由其子狀態處理的事件之外,其他事件都將被丟棄。也就是說事件可以發生,但它將被忽略,而且不因為該事件的出現而產生任何動作。

延遲事件的實現需要有一個內部事件隊列。如果一個事件發生,并被列為延遲事件,則進入隊列。一旦對象進入一個不延遲這些事件的狀態,這些事件就會從這個隊列中取走。

4.5、子狀態機

在一個狀態機中可以引用另一個狀態機。被引用的狀態機稱為子狀態機(submachine)。

5、子狀態

組合狀態既可能包含并發(正交的)子狀態也可能包含順序(非正交的)子狀態。

5.1、非正交子狀態

????????上圖表示通過使用嵌套子狀態,Active狀態有一個子結構,包括子狀態Validating、Selecting、Processing和Printing。當顧客將信用卡插入ATM機時,ATM的狀態從Idle轉移到Active。在進入Active狀態時,執行進入動作readCard。從子結構的初始狀態開始,控制從 Validating 狀態傳遞到Selecting 狀態,再到 Processing 狀態。在 Processing 狀態之后,控制可能返回到Selecting狀態(如顧客選擇另一個事務)或可能轉移到Printing狀態。在Printing狀態之后,有一個完成轉移返回到 Idle狀態。注意,Active狀態有一個退出動作來吐出顧客的信用卡。

????????由cancel事件觸發的從Active狀態到Idle狀態的轉移。在Active的任何子狀態中,顧客都可能取消這個事務,并使ATM返回到Idle狀態。

非正交子狀態將組合狀態的狀態空間分成一些不相交的狀態。

?一個嵌套的非正交狀態機最多有一個初始子狀態和一個最終子狀態。

5.2、歷史狀態

想要它記住在離開組合狀態之前最后活動著的子狀態

例如,在對一個通過網絡進行無人值守的計算機備份的代理的行為建模時,如果它曾被中斷(例如,被一個操作員的查詢中斷),希望它記住是在該過程的什么地方被中斷的。

用一個包含符號H的小圓圈來表示一個淺歷史狀態。

允許一個包含非正交子狀態的組合狀態來記住源自組合狀態的轉移之前最后的活動子狀態

在上圖中,假定處于BackingUp和Copying狀態中時,事件query被發出。控制離開Copying和BackingUp(必要時執行其退出動作),并返回到Command狀態。當Command的動作完成后,完成轉移返回到組合狀態BackingUp的歷史狀態。這一次,由于這個嵌套狀態機有了歷史,所以控制傳回到Copying狀態(繞過了Collecting狀態),因為Copying是從BackingUp轉移之前的最后一個活動子狀態。

符號H表示淺歷史,它只記住直接嵌套的狀態機歷史。

符號H*的小圓圈表示深歷史。深歷史將在任何深度上記住最深的嵌套狀態。

如果僅有一層嵌套,那么深歷史和淺歷史狀態在語義上是等同的。

如果有多于一層的嵌套,那么淺歷史只能記住最外層的嵌套狀態,而深歷史則可以在任何深度上記住最深層的嵌套狀態。

5.3、正交子狀態

在一個對象的語境中并行執行的兩個或多個狀態機。

上圖顯示了對圖5.1中的Maintenance狀態的一個擴展。

Maintenance被分解為兩個正交區域:Testing和Commanding,它們在Maintenance狀態中嵌套顯示,并用一條虛線分開

每個正交區域進一步分解為非正交子狀態

當控制從 Idle 狀態傳送到Maintenance狀態時,控制就分岔為兩個并發的流——這個對象將同時處于Testing區域和Commanding區域。而且,當處于 Commanding區域時,這個對象將處于 Waiting狀態或者Command狀態。
?

6、分叉與匯合

下圖它從Idle狀態轉到兩個嵌套狀態,即Self diagnose和區域Commanding的最終狀態。(最終狀態也是一個真實的狀態,可以作為轉移的目標)。如果在Self diagnose狀態活動時發生了錯誤,就會激活到Repair的隱式的匯合轉移:無論是Self diagnose狀態,還是Commanding區域內的任意活動狀態都會被退出。

圖中還有一個到狀態Offline的顯式的匯合轉移。只有當 Testing devices 狀態和 Commanding 區域的最終狀態是活動的,而且disconnect事件發生,才會激活這個轉移;如果兩個狀態都不活動,則該事件無效。
?

7、主動對象

對并發建模的另一種方式是使用主動對象。因而,不是把一個對象的狀態機劃分成兩個或多個并發區域,而是定義兩個主動對象,每個負責一個并發區域的行為

如果這些并發控制流中的一個控制流的行為受到其他控制流狀態的影響,就用正交區域來建模。

如果這些并發流中的一個控制流的行為受到與其他控制流來往的消息的影響,就用主動對象來建模

如果并發流之間的通信很少或根本就沒有,那么選擇哪種建模方法就全憑個人感覺了,通常用主動對象建模會使設計決策更明顯。

8、常用建模技術

8.1、為對象生命周期建模

交互用來對一起工作的對象群體的行為建模

而狀態機用來對單個對象的整個生命期的行為建模

主要描述以下3種事物:

1)對象能夠響應的事件,

2)對這些事件的響應,

3)過去對當前行為的影響。

為對象的生命期建模,還包括決定該對象能夠有意義地響應事件的次序,從對象的創建時開始,一直到它被撤銷。
?

建立過程:

  • 設置狀態機的語境,不管它是一個類、一個用況,還是整個系統。
  • 如果語境是一個類或一個用況,則找出相鄰的類,包括這個類的所有父類和通過依賴或關聯到達的所有類。這些鄰居是動作的候選目標或在監護條件中包含的候選項。
  • 如果語境是整個系統,則將注意力集中到這個系統的一個行為上。理論上,系統中每個對象都可以是系統生命期模型中的一個參加者,而且除了最微小的系統之外,建立一個完整的模型將是非常棘手的。
  • 建立這個對象的初始狀態和最終狀態。為了指導模型的剩余部分,可能要分別聲明初始狀態和最終狀態的前置條件和后置條件。
  • 判斷這個對象可能響應的事件。如果已經說明,則將在對象的接口中發現這些事件;如果還沒說明,就要考慮在語境中哪個對象可能與該對象交互,然后發現它們可能發送哪些事件。
  • 從初始狀態開始到最終狀態,列出這個對象可能處于的頂層狀態。用由適當的事件觸發的轉移將這些狀態連接起來,接著向這些轉移中添加動作。
  • 識別任何進入動作或退出動作(尤其當發現它們所適用的慣用法被用于狀態機時)。
  • 如果需要,通過使用子狀態來擴充這些狀態。
  • 檢查在狀態機中提供的所有事件是否和該對象接口所期望的事件相匹配。類似地,檢查該對象的接口所期望的所有事件是否都被狀態機所處理。最后,留意明顯地想忽略這些事件的地方。
  • 檢查在狀態機中提到的所有動作是否由對象的關系、方法和操作所支持。
  • 通過跟蹤狀態機(不管是手工地還是通過工具),根據期望的事件順序及其響應進行檢查。尤其要努力尋找那些不可達狀態和可能導致機器停止的狀態。
  • 在重新安排狀態機之后,按所期望的順序再一次檢查,以確保沒有改變該對象的語義。

上圖在這個控制器類的生命期中有 4個主要的狀態:

“初始化”Initializing(控制器開始運行)、“空閑”Idle(控制器準備好,并等待警報或來自用戶的命令)、“命令”Command(控制器正在處理來自用戶的命令)和“活動”Active(控制器正在處理一個警報條件)。

當第一次創建這個控制器對象時,首先進入Initializing狀態,然后無條件地進入Idle狀態。這兩個狀態的詳細信息并不顯示,但要顯示Idle狀態中帶有時間事件的自轉移。

這種時間事件在嵌入式系統中是常見的,它常常有一個心跳定時器,每隔一段時間就檢查一下系統的健康狀況。

當接收到一個“警報”alarm事件(包括參數s,表示發生錯誤的傳感器)時,控制從Idle狀態轉移到Active狀態。

進入Active狀態時,setAlarm作為進入動作執行,控制首先傳送到Checking狀態(驗證這個警報),然后傳送到Calling狀態(呼叫警報公司以登記這個警報),最后傳送到Waiting 狀態。僅當“清除”clearing 警報時,或是用戶向控制器發“注意”attention信號以通知可能發布一個命令時,才退出狀態Active和Waiting。

注意這里沒有最終狀態。這在嵌入式系統中也是常見的,希望系統無限期地運行。


?


?

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

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

相關文章

GOROOT GOPATH GOPROXY GO111MODULE

GOROOT GOROOT代表Go的安裝目錄。可執行程序go(或go.exe)和gofmt(或gofmt.exe)位于 GOROOT/bin目錄中。 配置GOROOT環境變量,其值為Go的安裝目錄;然后在環境變量PATH中添加GOROOT/bin路徑。 注意:GOROOT變量只是代表了安裝目錄,不…

泛型的實際應用示例

泛型的實際應用示例 1. 集合框架中的泛型 在Java的集合框架中,泛型被廣泛使用以確保類型安全并減少運行時錯誤。以下是一個使用泛型ArrayList的示例: java import java.util.ArrayList; import java.util.List; public class GenericCollectionsExamp…

【面試題】信息系統安全運維要做什么

信息系統安全運維是確保信息系統穩定、可靠、安全運行的一系列活動和措施。 其主要包括以下幾個方面: 1.系統監控: 實時監測信息系統的運行狀態,如服務器的性能指標、網絡流量、應用程序的運行情況等。通過監控工具,及時發現系統…

企業數據治理的下一步是數據資產管理?

隨著信息技術的飛速發展和數字化轉型的深入推進,企業數據已成為驅動業務增長和創新的核心要素。當企業數據治理工作取得顯著成效后,如何進一步發揮數據的價值,實現數據資產的有效管理,成為企業面臨的重要課題。 數據治理的基石作用…

算法練習——函數、遞歸和遞推

在此記錄一些有關函數、遞歸和遞推的問題。所有題目均來自洛谷的題單能力提升綜合題單Part1 入門階段 - 題單 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) (實際上都沒有用遞推做) [NOIP2001 普及組] 數的計算 題目描述 給出正整數 n n n&#xf…

學習感悟丨在譽天學習數通HCIP怎么樣

大家好,我是譽天學員的徐同學,學習的數通HCIP課程。 在學校的時候,聽說下半年就要出去實習了,心中坎坷不安,現在我學到的知識遠遠不夠的。然后就想著學點東西充實一下自己的知識面和專業能力,有一次和同學談…

【漏洞復現】飛企互聯——SQL注入

聲明:本文檔或演示材料僅供教育和教學目的使用,任何個人或組織使用本文檔中的信息進行非法活動,均與本文檔的作者或發布者無關。 文章目錄 漏洞描述漏洞復現測試工具 漏洞描述 飛企互聯-FE企業運營管理平臺是一個基于云計算、智能化、大數據…

[圖解] 向量數據庫之何謂乘積量化器?

Product Quantization 在前面一節講解了向量數據庫索引相關的內容,那么本節將會講解其中壓縮方法的量化手段:乘積量化器。 簡單來說將向量的所有維度劃分為多個子空間,每個子空間一部分維度,然后每個子空間獨立去找最近距離。例如…

haproxy實現代理和負載均衡

HaProxy介紹: haproxy是法國開發者威利塔羅在2000年使用C語言開發的一個開源軟件,是一款具備高并發(一萬以上)、高性能的TCP和HTTP負載均衡器,支持基于cookie的持久性,自動故障切換,支持正則表達式及web狀態統計&…

Numpy array和Pytorch tensor的區別

1.Numpy array和Pytorch tensor的區別 筆記來源: 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…

arthas監控工具筆記(一)

文章目錄 啟動 math-game啟動 arthas查看 dashboard通過 thread 命令來獲取到math-game進程的 Main Class通過 jad 來反編譯 Main Class退出 arthas 界面linux服務器掛不上進程怎么辦? 核心表達式變量loader 本次調用類所在的 ClassLoaderclazz 本次調用類的 Class 引用method…

信息學奧賽初賽天天練-39-CSP-J2021基礎題-哈夫曼樹、哈夫曼編碼、貪心算法、滿二叉樹、完全二叉樹、前中后綴表達式轉換

PDF文檔公眾號回復關鍵字:20240629 2022 CSP-J 選擇題 單項選擇題(共15題,每題2分,共計30分:每題有且僅有一個正確選項) 5.對于入棧順序為a,b,c,d,e的序列,下列( )不合法的出棧序列 A. a,b&a…

螺旋矩陣問題C代碼

給定一個n行m列的二維數組,要求按順時針螺旋順序輸出矩陣中的所有元素,n和m小于等于10 如下圖是一個三行四列的螺旋矩陣 要求輸出 1 2 3 4 8 12 11 10 9 5 6 7 全局變量定義 int a[11][11]; int vis[11][11]; // 訪問標記數組關鍵代碼如下 int dx[] …

MySQL高級-MVCC-基本概念(當前讀、快照讀)

文章目錄 1、MVCC基本概念1.1、當前讀1.1.1、創建表 stu1.1.2、測試 1.2、快照讀 1、MVCC基本概念 全稱Multi-Version Concurrency Control,多版本并發控制。指維護一個數據的多個版本,使得讀寫操作沒有沖突,快照讀為MySQL實現MVCC提供了一個…

OpenCV cv::Mat到 Eigen 的正確轉換——cv2eigen

在進行計算機視覺項目時,我們經常需要處理相機位姿的變換。最近,我在項目中遇到了一個看似簡單但實際上頗具挑戰性的問題:從 OpenCV 的 cv::Mat 格式轉換到 Eigen 庫的格式。這個過程中遇到了一些問題,但最終找到了一個穩健的解決…

鏤空的文字?分享 1 段優質 CSS 代碼片段!

大家好,我是大澈! 本文約 800 字,整篇閱讀約需 1 分鐘。 每日分享一段優質代碼片段。 今天分享一段優質 CSS 代碼片段,實現 CSS 文字鏤空的效果。 老規矩,先閱讀代碼片段并思考,再看代碼解析再思考&#…

nginx本地域名配置

修改hosts文件(僅限本地測試): 在Windows上,hosts文件位于C:\Windows\System32\drivers\etc\hosts。 打開hosts文件,添加一行:127.0.0.1 xxx.com (xxx.com為自己設定的域名) 如果修…

Leetcode3190. 使所有元素都可以被 3 整除的最少操作數

Every day a Leetcode 題目來源:3190. 使所有元素都可以被 3 整除的最少操作數 解法1:遍歷 遍歷數組,累加最少操作數,即 min(num % 3, 3 - num % 3)。 代碼: /** lc appleetcode.cn id3190 langcpp** [3190] 使所…

uniapp+vue3開發微信小程序踩坑集

本文主要記錄使用uniappvue3開發微信小程序遇見的各種常見問題及注意點。(持續更新) 問題: 自定義組件為什么有些樣式加不上去 給自定義組件增加class的時候,有時候不生效有時候生效,一度讓我懷疑自己記憶錯亂。后來…

C++枚舉

C枚舉 枚舉的基礎用法不不再贅述枚舉的三點問題1、作用域問題解決思路1解決思路2 2、隱式轉換成int3、枚舉變量的實際類型無法明確指定 枚舉的基礎用法不不再贅述 枚舉的三點問題 1、作用域問題 舉個例子,顏色有blue代表藍色,心情有blue代表憂郁。 以…