UML狀態(tài)圖

2023-06-28 16:37 更新

UML 狀態(tài)圖概述:

UML 狀態(tài)圖是圖表本身的名稱,主要用于描述對象具有的各種狀態(tài)、狀態(tài)之間的轉(zhuǎn)換過程以及觸發(fā)狀態(tài)轉(zhuǎn)換的各種事件和條件。

UML 狀態(tài)圖描述了一個(gè)狀態(tài)機(jī),可以被定義為一臺機(jī)器,它定義了一個(gè)對象,這些狀態(tài)控制外部或內(nèi)部事件的不同狀態(tài)。

狀態(tài)機(jī)由狀態(tài)、轉(zhuǎn)換、事件、活動和動作五部分組成。

  • 狀態(tài):狀態(tài)指的是對象在其生命周期中的一種狀況,處于某個(gè)特定狀態(tài)中的對象必然會滿足某些條件、執(zhí)行某些動作或者是等待某些事件。一個(gè)狀態(tài)的生命周期是一個(gè)有限的時(shí)間階段。
  • 轉(zhuǎn)換:轉(zhuǎn)換指的是兩個(gè)不同狀態(tài)之間的一種關(guān)系,表明對象在第一個(gè)狀態(tài)中執(zhí)行一定的動作,并且在滿足某個(gè)特定條件下由某個(gè)事件觸發(fā)進(jìn)入第二個(gè)狀態(tài)。
  • 事件:事件指的是發(fā)生在時(shí)間和空間上的對狀態(tài)機(jī)來講有意義的那些事情。事件通常會引起狀態(tài)的變遷,促使?fàn)顟B(tài)機(jī)從一種狀態(tài)切換到另一種狀態(tài),如信號、對象額度創(chuàng)建和銷毀等。
  • 活動:活動指的是狀態(tài)機(jī)中進(jìn)行的非原子操作。
  • 動作:動作指的是狀態(tài)機(jī)中可以執(zhí)行的哪些原子操作。所謂原子操作,指的是他們在運(yùn)行的過程中不能被其他消息中斷,必須一直執(zhí)行下去,以至最終導(dǎo)致狀態(tài)的變更或者返回一個(gè)值。

UML 狀態(tài)圖的目的:

UML 狀態(tài)圖可以捕獲對象、子系統(tǒng)和系統(tǒng)的生命周期,可以告知一個(gè)對象可以擁有的狀態(tài),并且事件(如消息的接收,時(shí)間的流逝、錯(cuò)誤、條件為真等)會怎樣隨著時(shí)間的推移來影響這些狀態(tài)。一個(gè)狀態(tài)圖應(yīng)該連接到所有具有清晰的可標(biāo)志狀態(tài)和復(fù)雜行為的類;該圖可以確定類的行為以及該行為如何根據(jù)當(dāng)前的狀態(tài)而變化,也可以展示哪些事件將會改變類的對象的狀態(tài)。

狀態(tài)圖主要是為了模擬響應(yīng)系統(tǒng)。

以下是使用狀態(tài)圖的主要目的:

  • 為了模擬系統(tǒng)的動態(tài)環(huán)節(jié)。

  • 反應(yīng)系統(tǒng)模型生命周期。

  • 一個(gè)對象來描述不同的狀態(tài),在其生命周期的時(shí)間。

  • 定義一個(gè)狀態(tài)機(jī)模型狀態(tài)的對象。

UML 狀態(tài)圖怎么畫

狀態(tài)圖是用來描述不同的對象在其生命周期的狀態(tài)。因此,強(qiáng)調(diào)的是一些內(nèi)部或外部事件的狀態(tài)發(fā)生變化時(shí),這些對象的狀態(tài)要重要的分析和準(zhǔn)確的貫徹落實(shí)。

狀態(tài)圖描述的狀態(tài)是非常重要的。對象的狀況,當(dāng)發(fā)生特定事件時(shí),可以被確定為狀態(tài)。

繪制狀態(tài)圖之前,我們必須明確以下幾點(diǎn):

  • 識別對象,以進(jìn)行分析。

  • 識別狀態(tài)。

  • 識別的事件。

一個(gè)狀態(tài)圖(Statechart Diagram)本質(zhì)上就是一個(gè)狀態(tài)機(jī),或者是狀態(tài)機(jī)的特殊情況,它基本上是一個(gè)狀態(tài)機(jī)中元素的一個(gè)投影,這也就意味著狀態(tài)圖包括狀態(tài)機(jī)的所有特征。

狀態(tài)圖描述了一個(gè)實(shí)體基于事件反映的動態(tài)行為,顯示了該實(shí)體是如何根據(jù)當(dāng)前所處的狀態(tài)對不同的事件作出反應(yīng)的。

在UML中,狀態(tài)圖由表示狀態(tài)的節(jié)點(diǎn)和表示狀態(tài)之間轉(zhuǎn)換的帶箭頭的直線組成。狀態(tài)的轉(zhuǎn)換由事件觸發(fā),狀態(tài)和狀態(tài)之間由轉(zhuǎn)換箭頭連接。每一個(gè)狀態(tài)圖都有一個(gè)初始狀態(tài)(實(shí)心圓),用來表示狀態(tài)機(jī)的開始。還有一個(gè)中止?fàn)顟B(tài)(半實(shí)心圓),用來表示狀態(tài)機(jī)的終止。狀態(tài)圖主要由元素狀態(tài)、轉(zhuǎn)換、初始狀態(tài)、中止?fàn)顟B(tài)和判定等組成,一個(gè)簡單的狀態(tài)圖如下:



1.狀態(tài):狀態(tài)用于對實(shí)體在其生命周期中的各種狀況進(jìn)行建模,一個(gè)實(shí)體總是在有限的一段時(shí)間內(nèi)保持一個(gè)狀態(tài)。狀態(tài)由一個(gè)帶圓角的矩形表示,狀態(tài)的描繪素應(yīng)該包括名稱、入口和出口動作、內(nèi)部轉(zhuǎn)換和嵌套狀態(tài)。如下圖,為一個(gè)簡單狀態(tài):

  • 狀態(tài)名指的是狀態(tài)的名字,通常用字符串表示,其中每個(gè)單詞的首字母大寫。狀態(tài)名可以包含任意數(shù)量的字母、數(shù)字和除了冒號“:”以外的一些字符,可以較長,甚至連續(xù)幾行。但是一定要注意一個(gè)狀態(tài)的名稱在狀態(tài)圖所在的上下文中應(yīng)該是唯一的,能夠把該狀態(tài)和其他狀態(tài)區(qū)分開。
  • 入口和出口動作一個(gè)狀態(tài)可以具有或者沒有入口和出口動作。入口和出口動作分別指的是進(jìn)入和退出一個(gè)狀態(tài)時(shí)所執(zhí)行的“邊界”動作。
  • 內(nèi)部轉(zhuǎn)換指的是不導(dǎo)致狀態(tài)改變的轉(zhuǎn)換。內(nèi)部轉(zhuǎn)換中可以包含進(jìn)入或者退出該狀態(tài)應(yīng)該執(zhí)行的活動或動作。
  • 嵌套狀態(tài)狀態(tài)分為簡單狀態(tài)(Simple State)和組成狀態(tài)(Composite State)。簡單狀態(tài)是指在語義上不可分解的、對象保持一定屬性值的狀況,簡單狀態(tài)不包含其他狀態(tài):而組成狀態(tài)是指內(nèi)部嵌套有子狀態(tài)的狀態(tài),在組成狀態(tài)的嵌套狀態(tài)圖部分包含的就是此狀態(tài)的子狀態(tài)。

2.轉(zhuǎn)換:在UML的狀態(tài)建模機(jī)制中,轉(zhuǎn)換用帶箭頭的直線表示,一端連接源狀態(tài),箭頭指向目標(biāo)狀態(tài)。轉(zhuǎn)換還可以標(biāo)注與此轉(zhuǎn)換相關(guān)的選項(xiàng),如事件、監(jiān)護(hù)條件和動作等,如下圖所示。注意:如果轉(zhuǎn)換上沒有標(biāo)注觸發(fā)轉(zhuǎn)換的事件,則表示此轉(zhuǎn)換自動進(jìn)行。


在狀態(tài)轉(zhuǎn)換機(jī)制中需要注意的五個(gè)概念如下:

  • 狀態(tài)源(Source State):指的是激活轉(zhuǎn)換之間對象處于的狀態(tài)。如果一個(gè)一個(gè)狀態(tài)處于源狀態(tài),當(dāng)它接收到轉(zhuǎn)換的觸發(fā)事件或滿足監(jiān)護(hù)條件時(shí),就激活了一個(gè)離開的轉(zhuǎn)換。
  • 目標(biāo)狀態(tài)(Event State):指的是轉(zhuǎn)換完成后對象所處的狀態(tài)。
  • 事件觸發(fā)器(Event Trigger):指的是引起源狀態(tài)轉(zhuǎn)換的事件。事件不是持續(xù)發(fā)生的,它只發(fā)生在時(shí)間的一點(diǎn)上,對象接收到事件,導(dǎo)致源狀態(tài)發(fā)生變化,激活轉(zhuǎn)換并使監(jiān)護(hù)條件得到滿足。
  • 監(jiān)護(hù)條件(Guard Condition):是一個(gè)布爾表達(dá)式。當(dāng)接收到觸發(fā)事件要觸發(fā)轉(zhuǎn)換時(shí),要對該表達(dá)式求值。如果表達(dá)式為真,則激活轉(zhuǎn)換:如果表達(dá)式為假,則不激活轉(zhuǎn)換,所接收到的觸發(fā)事件丟失。
  • 動作(Action):是一個(gè)可執(zhí)行的原子計(jì)算。

3.初始狀態(tài):每個(gè)狀態(tài)圖都應(yīng)該有一個(gè)初始狀態(tài),它代表狀態(tài)圖的起始位置。初始狀態(tài)是一個(gè)偽狀態(tài)(一個(gè)和普通狀態(tài)有連接的假狀態(tài)),對象不可能保持在初始狀態(tài),必須要有一個(gè)輸出的無觸發(fā)轉(zhuǎn)換(沒有事件觸發(fā)器的轉(zhuǎn)換)。通常初始狀態(tài)上的轉(zhuǎn)換是無監(jiān)護(hù)條件的,并且初始狀態(tài)只能作為轉(zhuǎn)換的源,而不能作為轉(zhuǎn)換的目標(biāo)。在UML中,一個(gè)狀態(tài)圖只能有一個(gè)初始狀態(tài),用一個(gè)實(shí)心圓表示。

4.終止?fàn)顟B(tài):終止?fàn)顟B(tài)是一個(gè)狀態(tài)圖的終點(diǎn),一個(gè)狀態(tài)圖可以擁有一個(gè)或者多個(gè)終止?fàn)顟B(tài)。對象可以保持在終止?fàn)顟B(tài),但是終止?fàn)顟B(tài)不可能有任何形式的和觸發(fā)轉(zhuǎn)換,它的目的就是為了激發(fā)封裝狀態(tài)上的轉(zhuǎn)換過程的結(jié)束。因此,終止?fàn)顟B(tài)只能作為轉(zhuǎn)換的目標(biāo)而不能作為轉(zhuǎn)換的源,在UML中,終止?fàn)顟B(tài)用一個(gè)含有實(shí)心圓的空心圓表示。

5.判定:活動圖和狀態(tài)圖中都有需要根據(jù)給定條件進(jìn)行判斷,然后根據(jù)不同的判斷結(jié)果進(jìn)行不同轉(zhuǎn)換的情況。實(shí)際就是工作流在此處按監(jiān)護(hù)條件的取值發(fā)生分支,在UML中,判定用空心菱形表示。

狀態(tài)圖的作用

狀態(tài)圖的作用主要體現(xiàn)在以下幾個(gè)方面。

  • 狀態(tài)圖清晰地描述了狀態(tài)之間的轉(zhuǎn)換順序,通過狀態(tài)的轉(zhuǎn)換順序也就可以清晰地看出事件的執(zhí)行順序。如果沒有狀態(tài)圖我們就不可避免地要使用大量文字來描述外部事件的合法順序。
  • 清晰的事件順序有利于程序員在開發(fā)程序時(shí)避免出現(xiàn)事件順序錯(cuò)誤的情況。例如,對于一個(gè)網(wǎng)上銷售系統(tǒng),在用戶處于登錄狀態(tài)前是不允許購買商品的,這就需要程序員開發(fā)程序的過程中加以限制。
  • 狀態(tài)圖清晰地描述了狀態(tài)轉(zhuǎn)換時(shí)所必需的觸發(fā)事件、監(jiān)護(hù)條件和動作等影響轉(zhuǎn)換的因素,有利于程序員避免程序中非法事件的進(jìn)入。例如,飛機(jī)起飛前半小時(shí)不允許售票,在狀態(tài)圖中就可以清晰地看到,可以提醒程序員不要遺漏這些限制條件。
  • 狀態(tài)圖通過判定可以更好地描述工作流因?yàn)椴煌臈l件發(fā)生的分支。例如,當(dāng)一個(gè)班的人數(shù)少于10人的時(shí)候需要和其他班合為一班上課,大于10人則單獨(dú)上課,在狀態(tài)圖中就可以很明確地表達(dá)出來。

總之一個(gè)簡潔完整的狀態(tài)圖可以幫助一個(gè)設(shè)計(jì)者不遺漏任何事情,最大程度地避免程序中錯(cuò)誤的發(fā)生。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號