• <menu id="w2i4a"></menu>
  • logo Enterprise Architect教程

    文檔首頁>>Enterprise Architect教程>>UML軟件開發(fā)與建模工具Enterprise Architect教程:UML 2教程-狀態(tài)機(jī)圖

    UML軟件開發(fā)與建模工具Enterprise Architect教程:UML 2教程-狀態(tài)機(jī)圖


    Enterprise Architect是一個對于軟件系統(tǒng)開發(fā)有著極好支持的CASE軟件(Computer Aided Software Engineering)。EA不同于普通的UML畫圖工具(如VISIO),它將支撐系統(tǒng)開發(fā)的全過程。在需求分析階段,系統(tǒng)分析與設(shè)計(jì)階段,系統(tǒng)開發(fā) 及部署等方面有著強(qiáng)大的支持,同時加上對10種編程語言的正反向工程,項(xiàng)目管理,文檔生成,數(shù)據(jù)建模等方面。可以讓系統(tǒng)開發(fā)中各個角色都獲得最好的開發(fā)效率。

    點(diǎn)擊下載Enterprise Architect最新試用版

    狀態(tài)機(jī)圖

    狀態(tài)機(jī)圖對單個對象的行為進(jìn)行建模,指定對象在其生命周期中響應(yīng)事件而經(jīng)歷的事件順序。
    例如,以下狀態(tài)機(jī)圖顯示了門在其生命周期內(nèi)所經(jīng)歷的狀態(tài)。

    UML軟件開發(fā)與建模工具Enterprise Architect教程:UML 2教程-狀態(tài)機(jī)圖

    門可以處于以下三種狀態(tài)之一:“打開”,“關(guān)閉”或“鎖定”。它可以響應(yīng)打開,關(guān)閉,鎖定和解鎖事件。請注意,并非所有事件在所有狀態(tài)下都有效。例如,如果一扇門打開了,則只有在關(guān)上門后才能將其鎖定。還要注意,狀態(tài)轉(zhuǎn)換可以附加一個保護(hù)條件:如果門已打開,則僅當(dāng)滿足條件doorWay-> isEmpty時,它才能響應(yīng)Close事件。以下各節(jié)將全面討論狀態(tài)機(jī)圖中使用的語法和約定。

    狀態(tài)

    用圓角矩形表示狀態(tài),狀態(tài)名稱寫在其中。

    狀態(tài)

    初始狀態(tài)和最終狀態(tài)

    初始狀態(tài)由實(shí)心黑色圓圈表示,并可以用名稱標(biāo)記。最終狀態(tài)由內(nèi)部帶有圓點(diǎn)的圓圈表示,也可以標(biāo)記名稱。

    初始狀態(tài)和最終狀態(tài)

    轉(zhuǎn)場

    從一個狀態(tài)到下一個狀態(tài)的過渡用帶箭頭的線表示。過渡可能具有觸發(fā),防護(hù)和效果,如下所示。

    轉(zhuǎn)場

    “觸發(fā)”是轉(zhuǎn)換的原因,可能是信號,事件,某些條件的變化或時間的流逝?!氨Wo(hù)”是一個必須為true的條件,觸發(fā)器才能引起轉(zhuǎn)換?!靶Ч笔且环N動作,由于轉(zhuǎn)換,該動作將直接在擁有狀態(tài)機(jī)的對象上調(diào)用。

    State Actions

    在上面的過渡示例中,效果與過渡相關(guān)聯(lián)。如果目標(biāo)狀態(tài)有許多過渡到達(dá),并且每個過渡都具有與之關(guān)聯(lián)的相同效果,則最好將效果與目標(biāo)狀態(tài)關(guān)聯(lián)而不是過渡。這可以通過為狀態(tài)定義一個輸入動作來完成。下圖顯示了帶有進(jìn)入動作和退出動作的狀態(tài)。

    國家行動

    也可以定義在事件上發(fā)生的動作或始終發(fā)生的動作??梢远x每種類型的任意數(shù)量的動作。

    自我轉(zhuǎn)變

    狀態(tài)可以具有返回自身的過渡,如下圖所示。當(dāng)效果與過渡相關(guān)聯(lián)時,這是最有用的。

    自我轉(zhuǎn)變

    復(fù)合狀態(tài)

    狀態(tài)機(jī)圖可以包括子機(jī)圖,如以下示例所示。

    復(fù)合狀態(tài)

    顯示相同信息的另一種方法如下。

    復(fù)合狀態(tài)2

    上述版本中的符號表示在另一張圖中顯示了Check PIN子機(jī)的詳細(xì)信息。

    入口點(diǎn)

    有時,您不想在正常的初始狀態(tài)下進(jìn)入子計(jì)算機(jī)。例如,在下面的子計(jì)算機(jī)中,通常以“ Initializing”狀態(tài)開始,但是如果由于某種原因不需要執(zhí)行初始化,則可以通過“ Ready”狀態(tài)開始過渡到指定的入口點(diǎn)。

    入口點(diǎn)

    下圖顯示了上一級狀態(tài)機(jī)。

    入口點(diǎn)2

    出口點(diǎn)

    以類似于入口點(diǎn)的方式,可以命名替代出口點(diǎn)。下圖給出了一個示例,在該示例中,在主處理狀態(tài)之后執(zhí)行的狀態(tài)取決于使用哪條路徑轉(zhuǎn)換出該狀態(tài)。

    出口點(diǎn)

    選擇偽狀態(tài)

    選擇偽狀態(tài)顯示為菱形,其中一個過渡到達(dá),而兩個或多個過渡離開。下圖顯示,在選擇偽狀態(tài)之后到達(dá)的任何狀態(tài)都取決于在執(zhí)行前一狀態(tài)期間選擇的消息格式。

    選擇偽狀態(tài)

    偽狀態(tài)連接點(diǎn)

    結(jié)偽狀態(tài)用于將多個轉(zhuǎn)換鏈接在一起。單個結(jié)可以具有一個或多個傳入的轉(zhuǎn)換和一個或多個傳出的轉(zhuǎn)換;可以對每個過渡應(yīng)用防護(hù)。結(jié)點(diǎn)無語義。將輸入的過渡轉(zhuǎn)換為多個輸出的過渡的結(jié)實(shí)現(xiàn)了靜態(tài)條件分支,而選擇偽狀態(tài)則實(shí)現(xiàn)了動態(tài)條件分支。

    結(jié)偽狀態(tài)

    終止偽狀態(tài)

    輸入終止偽狀態(tài)表示狀態(tài)機(jī)的生命線已結(jié)束。終止偽狀態(tài)標(biāo)記為叉號。

    終止偽狀態(tài)

    歷史狀態(tài)

    歷史狀態(tài)用于記住狀態(tài)機(jī)被中斷時的先前狀態(tài)。下圖說明了歷史狀態(tài)的使用。該示例是屬于洗衣機(jī)的狀態(tài)機(jī)。

    歷史狀態(tài)

    在這種狀態(tài)機(jī)下,當(dāng)洗衣機(jī)運(yùn)行時,它將從“洗滌”到“漂洗”進(jìn)入“旋轉(zhuǎn)”狀態(tài)。如果斷電,則洗衣機(jī)將停止運(yùn)行并進(jìn)入“關(guān)閉電源”狀態(tài)。然后,在恢復(fù)電源后,將在“歷史狀態(tài)”符號處進(jìn)入“運(yùn)行”狀態(tài),這意味著它應(yīng)從上次中斷的位置恢復(fù)。

    并發(fā)區(qū)域

    可以將狀態(tài)劃分為包含子狀態(tài)的區(qū)域,這些子狀態(tài)同時存在并執(zhí)行。下面的示例顯示,在“正在應(yīng)用制動”狀態(tài)下,前后制動器將同時且獨(dú)立運(yùn)行。注意使用fork和join偽狀態(tài),而不是選擇和合并偽狀態(tài)。這些符號用于同步并發(fā)線程。

    并發(fā)區(qū)域

    =====================================================

    想要了解或購買Enterprise Architect正版版權(quán),請咨詢慧都官方客服

    UML軟件開發(fā)與建模工具Enterprise Architect教程:UML 2教程-狀態(tài)機(jī)圖
    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();