能夠把狀態機的要素分爲4個要素,即:現態、條件、動做、次態。
「現態」和「條件」是因,「動做」和「次態」是果。spa
(1)現態:是指當前所處狀態;
(2)條件:又稱爲「事件」。當條件被知足時,將會觸發一個動做,或者執行一次狀態的遷移。
(3)動做:條件知足後執行的動做。動做不是必須的,當條件知足後,也能夠不執行任何動做,直接遷移到新狀態。
(4)次態:條件知足後要遷移往的新狀態。「次態」是相對於「現態」而言的,「次態」一旦被激活,就轉變成新的「現態」了。blog
(1)狀態框:用方框表示狀態,包括所謂的「現態」和「次態」;
(2)條件及遷移箭頭:用箭頭表示狀態遷移的方向,並在該箭頭上標註觸發條件;
(3)節點圓圈:當多個箭頭指向一個狀態時,能夠用節點符號(小圓圈)鏈接彙總;
(4)動做框:用橢圓框表示;
(5)附加條件判斷框:用六角菱形框表示;進程
首先咱們畫出他的狀態遷移圖:事件
而後咱們畫出狀態遷移表:變量
注意使用狀態機的時候不要出現兩種錯誤:一、「僞態」二、「漏態」
(1)「僞態」:把某個「程序動做」當成一種「狀態」來處理。
(2)「漏態」:在狀態劃分時漏掉一些狀態。bfc
PS:程序
區分狀態和僞態:(看二者的本質)
「動做」是不穩定的,即便沒有條件的觸發,「動做」一旦執行完畢就結束了;
「狀態」是相對穩定的,若是沒有外部條件的觸發,一個狀態會一直持續下去。im
前面介紹的是一種簡單的狀態結構。它只有一級,而且只有一維,它的結構圖以下所示:d3
若是有必要,咱們能夠創建更復雜的狀態機模型。如:img
狀態機能夠是多級的。在分層的多級狀態機系統裏面,一個「父狀態」下能夠劃分多個「子狀態」,這些子狀態共同擁有上級父狀態的某些共性,同時又各自擁有本身的一些個性。
狀態機也能夠是多維的。從不一樣的角度對系統進行狀態的劃分,這些狀態的某些特性是交叉的。好比,在按照按鍵和顯示劃分狀態的同時,又按照系統的工做進程作出另外一種狀態劃分。這兩種狀態劃分同時存在,相互交叉。從而構成了二維的狀態結構空間。
說明一下,每一維的狀態都須要用一個狀態變量(寄存器)來表示。
最後我想說一下:無論是什麼樣子的程序寫成狀態機,只有一個原則,那就是簡單的纔是最有效的!!