有限狀態(tài)機(jī)是什么

1.背景介紹

什么是有限狀態(tài)機(jī)?

有限狀態(tài)機(jī)(Finite-state machine)是一個(gè)非常有用的模型鬓催,可以模擬世界上大部分事物肺素。它 是一個(gè)數(shù)學(xué)模型。是一個(gè)抽象機(jī)器宇驾,在任何時(shí)候都可以處于有限數(shù)量的狀態(tài)之一倍靡。響應(yīng)某些外部輸入, FSM可以從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài); 從一種狀態(tài)到另一種狀態(tài)的變化稱為過(guò)渡课舍。 狀態(tài)機(jī)的行為可以在現(xiàn)代社會(huì)中的許多設(shè)備中觀察到塌西,這些設(shè)備根據(jù)它們呈現(xiàn)的事件序列執(zhí)行預(yù)定的一系列行為。 例如自動(dòng)售貨機(jī)筝尾,當(dāng)存放適當(dāng)?shù)挠矌沤M合時(shí)分配產(chǎn)品捡需,當(dāng)車輛等待時(shí)改變順序的交通燈等。

在我們前端開發(fā)中筹淫,我們可以套用有限狀態(tài)機(jī)模型站辉,將業(yè)務(wù)流程狀態(tài)化,劃分狀態(tài)和相應(yīng)的觸發(fā)事件與動(dòng)作,利用生命周期事件進(jìn)行控制與執(zhí)行

2.知識(shí)剖析

有限狀態(tài)機(jī)一般都有以下特點(diǎn):?

(1)可以用狀態(tài)來(lái)描述事物饰剥,并且任一時(shí)刻殊霞,事物總是處于一種狀態(tài);

(2)事物擁有的狀態(tài)總數(shù)是有限的汰蓉;

(3)通過(guò)觸發(fā)事物的某些行為绷蹲,可以導(dǎo)致事物從一種狀態(tài)過(guò)渡到另一種狀態(tài);

(4)事物狀態(tài)變化是有規(guī)則的古沥,A狀態(tài)可以變換到B瘸右,B可以變換到C,A卻不一定能變換到C岩齿;

(5)同一種行為,可以將事物從多種狀態(tài)變成同種狀態(tài)苞俘,但是不能從同種狀態(tài)變成多種狀態(tài)盹沈。


狀態(tài)機(jī)由一組狀態(tài)和轉(zhuǎn)換組成:?

狀態(tài) : 固體 、 液體 吃谣、 氣體乞封。?

轉(zhuǎn)換 :融化 、汽化 岗憋、 冷凝 肃晚、 凍結(jié)。?


以上的形式可以狀態(tài)機(jī)來(lái)寫一下

首先需要引入有限狀態(tài)機(jī)庫(kù)?狀態(tài)機(jī)庫(kù)

以上的形式可以狀態(tài)機(jī)來(lái)寫一下

首先需要引入有限狀態(tài)機(jī)庫(kù)?狀態(tài)機(jī)庫(kù)

var fsm = new StateMachine({

? ? ? ? ? ? ? ? init: 'solid',

? ? ? ? ? ? ? ? transitions: [

? ? ? ? ? ? ? ? ? { name: 'melt',? ? from: 'solid',? to: 'liquid' },

? ? ? ? ? ? ? ? ? { name: 'freeze',? from: 'liquid', to: 'solid'? },

? ? ? ? ? ? ? ? ? { name: 'vaporize', from: 'liquid', to: 'gas'? ? },

? ? ? ? ? ? ? ? ? { name: 'condense', from: 'gas',? ? to: 'liquid' }

? ? ? ? ? ? ? ? ],

? ? ? ? ? ? ? ? methods: {

? ? ? ? ? ? ? ? ? onMelt:? ? function(){ console.log('I melted')? ? },

? ? ? ? ? ? ? ? ? onFreeze:? function(){ console.log('I froze')? ? },

? ? ? ? ? ? ? ? ? onVaporize: function(){ console.log('I vaporized') },

? ? ? ? ? ? ? ? ? onCondense: function(){ console.log('I condensed') }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? });

? ? ? ? ? ? ? ? ? ? ? ? ? ? //方法調(diào)用? ? ? ? ? ? ? ? ? ? ? ? //1仔戈,自執(zhí)行方法:? ? ? ? ? ? ? ? ? ? ? ? fsm.onMelt();

? ? ? ? ? ? ? ? ? ? ? ? fsm.onFreeze();

? ? ? ? ? ? ? ? ? ? ? ? fsm.onVaporize();

? ? ? ? ? ? ? ? ? ? ? ? fsm.onCondense();

? ? ? ? ? ? ? ? ? ? ? ? //1关串、觸發(fā)調(diào)用方式:? ? ? ? ? ? ? ? ? ? ? ? fsm.Melt();

? ? ? ? ? ? ? ? ? ? ? ? fsm.Freeze();

? ? ? ? ? ? ? ? ? ? ? ? fsm.Vaporize();

? ? ? ? ? ? ? ? ? ? ? ? fsm.Condense();

init選項(xiàng)用來(lái)表示fsm對(duì)象的初始狀態(tài),?

transitions選項(xiàng)用來(lái)描述fsm對(duì)象所有狀態(tài)的變化規(guī)則监徘,每一種變化規(guī)則對(duì)應(yīng)一種行為晋修。?

methods方法為實(shí)例的每一種行為都添加了一個(gè)方法,調(diào)用這個(gè)方法就相當(dāng)于觸發(fā)對(duì)象的某種行為凰盔,當(dāng)對(duì)象行為發(fā)生時(shí)墓卦,對(duì)象的狀態(tài)就可以發(fā)生變化。如以上例子創(chuàng)建的實(shí)例將擁有如下行為方法:?

fsm.Melt() : 調(diào)用該方法户敬,實(shí)例狀態(tài)將從'solid'變?yōu)?liquid'?

fsm.Freeze() : 調(diào)用該方法落剪,實(shí)例狀態(tài)將從'liquid'變?yōu)?solid'?

fsm.Vaporize() : 調(diào)用該方法,實(shí)例狀態(tài)將從'liquid'變?yōu)?gas'?

fsm.Condense() : 調(diào)用該方法尿庐,實(shí)例狀態(tài)將從'gas'變?yōu)?liquid'

Javascript Finite State Machine允許為每個(gè)事件指定兩個(gè)自定義方法忠怖,以Melt事件為例:?

onbeforeMelt:在Melt事件發(fā)生之前觸發(fā)?

onafterMelt :在Melt事件發(fā)生之后觸發(fā)。?

每個(gè)狀態(tài)指定兩個(gè)自定義方法屁倔,以solid狀態(tài)為例:?

onleaveSolid :在離開solid狀態(tài)時(shí)觸發(fā)?

onenterLiquid :在進(jìn)入liquid狀態(tài)時(shí)觸發(fā)脑又。

輔助方法:?

// fsm.is(s) - 如果狀態(tài)s是當(dāng)前狀態(tài),則返回true?

// fsm.can(t) - 如果t從當(dāng)前狀態(tài)發(fā)生轉(zhuǎn)換,則返回true?

// fsm.cannot(t) - 如果t從當(dāng)前狀態(tài)不能發(fā)生轉(zhuǎn)換问麸,則返回true

// fsm.transitions() - 返回當(dāng)前狀態(tài)允許的轉(zhuǎn)換列表?

// fsm.allTransitions() - 返回所有可能的轉(zhuǎn)換的列表?

// fsm.allStates() - 返回所有可能狀態(tài)的列表?

//Cancelling a Transition 取消轉(zhuǎn)換?

3.常見(jiàn)問(wèn)題

有限狀態(tài)機(jī)有哪些應(yīng)用場(chǎng)景往衷?

4.解決方案

滿足3點(diǎn)即可用:所需狀態(tài)確定,有事件觸發(fā)轉(zhuǎn)變狀態(tài)严卖,總狀態(tài)有限且轉(zhuǎn)變有規(guī)律席舍。

頁(yè)面可用有限狀態(tài)機(jī)的元素較多且有規(guī)律時(shí)可用:例如:開關(guān)按鈕,下拉菜單哮笆,

還有任務(wù)中殺人游戲的玩家死活狀態(tài)来颤、白天黑夜?fàn)顟B(tài)等,這里實(shí)現(xiàn)的是流程控制

?我的坑乎回答

5.編碼實(shí)戰(zhàn)

6.擴(kuò)展思考

有限狀態(tài)機(jī)有哪些優(yōu)點(diǎn)稠肘?

有限狀態(tài)機(jī)的寫法福铅,邏輯清晰,表達(dá)力強(qiáng)项阴,有利于封裝事件滑黔。一個(gè)對(duì)象的狀態(tài)越多、發(fā)生的事件越多环揽,就越適合采用有限狀態(tài)機(jī)的寫法略荡。 另外,JavaScript語(yǔ)言是一種異步操作特別多的語(yǔ)言歉胶,常用的解決方法是指定回調(diào)函數(shù)汛兜, 但這樣會(huì)造成代碼結(jié)構(gòu)混亂、難以測(cè)試和除錯(cuò)等問(wèn)題通今。有限狀態(tài)機(jī)提供了更好的辦法: 把異步操作與對(duì)象的狀態(tài)改變掛鉤粥谬,當(dāng)異步操作結(jié)束的時(shí)候,發(fā)生相應(yīng)的狀態(tài)改變衡创,由此再觸發(fā)其他操作帝嗡。 這要比回調(diào)函數(shù)、事件監(jiān)聽璃氢、發(fā)布/訂閱等解決方案哟玷,在邏輯上更合理,更易于降低代碼的復(fù)雜度一也。

7.參考文獻(xiàn)

參考一:有限狀態(tài)機(jī)庫(kù)

參考二:阮一峰的有限狀態(tài)機(jī)

8.更多討論

控制天數(shù)變化巢寡,該如何實(shí)現(xiàn)

創(chuàng)建一個(gè)控制天數(shù)的參數(shù)

? ? var day=new StateMachine({

? ? ? ? init:'1',

? ? ? ? transitions:[{

? ? ? ? ? ? name:'add',

? ? ? ? ? ? from:'1',

? ? ? ? ? ? to:'1++'

? ? ? ? },

? ? ? ? {

? ? ? ? ? ? name:'over',

? ? ? ? ? ? from:'1++',

? ? ? ? ? ? to:'1'

? ? ? ? }

? ? ? ? ],

? ? ? ? methods:{

? ? ? ? ? ? onAdd:function(){

? ? ? ? ? ? }

? ? ? ? }

? ? })

PPT:https://ptteng.github.io/WEB/ppt/js-03-fsmhz.html#/

騰訊視頻:https://v.qq.com/x/page/o0614efgh7s.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椰苟,隨后出現(xiàn)的幾起案子抑月,更是在濱河造成了極大的恐慌,老刑警劉巖舆蝴,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谦絮,死亡現(xiàn)場(chǎng)離奇詭異题诵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)层皱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門性锭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人叫胖,你說(shuō)我怎么就攤上這事草冈。” “怎么了瓮增?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵怎棱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绷跑,道長(zhǎng)拳恋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任你踩,我火速辦了婚禮诅岩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘带膜。我一直安慰自己,他們只是感情好鸳谜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布膝藕。 她就那樣靜靜地躺著,像睡著了一般咐扭。 火紅的嫁衣襯著肌膚如雪芭挽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天蝗肪,我揣著相機(jī)與錄音袜爪,去河邊找鬼。 笑死薛闪,一個(gè)胖子當(dāng)著我的面吹牛辛馆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豁延,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昙篙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了诱咏?” 一聲冷哼從身側(cè)響起苔可,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袋狞,沒(méi)想到半個(gè)月后焚辅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體映屋,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年同蜻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棚点。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埃仪,死狀恐怖乙濒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卵蛉,我是刑警寧澤颁股,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站傻丝,受9級(jí)特大地震影響甘有,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葡缰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一拘悦、第九天 我趴在偏房一處隱蔽的房頂上張望茬高。 院中可真熱鬧,春花似錦、人聲如沸靖秩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹰贵。三九已至,卻和暖如春茄茁,著一層夾襖步出監(jiān)牢的瞬間魂贬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工裙顽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留付燥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓愈犹,卻偏偏與公主長(zhǎng)得像键科,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甘萧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容