一诚欠,前言
之前在搜索循環(huán)隊(duì)列的時(shí)候顽染,不小心搜索到了狀態(tài)機(jī)設(shè)計(jì)的書,作為c語言開發(fā)者轰绵,所謂的面向?qū)ο笠簿褪墙Y(jié)構(gòu)體當(dāng)做一個(gè)對象粉寞,所謂的繼承就是大結(jié)構(gòu)體打包小結(jié)構(gòu)體。然后c語言主要是面向過程的語言左腔,我以前以為只有復(fù)雜的邏輯才能使用狀態(tài)機(jī)唧垦,簡單的邏輯無法用狀態(tài)機(jī)設(shè)計(jì),看了這書后才發(fā)現(xiàn)所有功能都可以用狀態(tài)機(jī)來設(shè)計(jì)的液样。狀態(tài)機(jī)算是面向?qū)ο蟮脑O(shè)計(jì)业崖,然后此對象就是狀態(tài)。
二蓄愁,入門
我也曾經(jīng)用vb和c#和QT制作做計(jì)算器双炕,仔細(xì)回想下,我做的計(jì)算器只支持簡單的整數(shù)運(yùn)算撮抓,根本不算個(gè)計(jì)算器妇斤。看了此書后丹拯,才發(fā)現(xiàn)其實(shí)我根本不懂狀態(tài)機(jī)的設(shè)計(jì)站超,此書最重要讓我學(xué)習(xí)到的就是一個(gè)狀態(tài)機(jī)繼承的概念,之前看UML的設(shè)計(jì)中主要關(guān)注時(shí)序圖乖酬,沒有看狀態(tài)機(jī)死相,在UML就是叫層次狀態(tài)機(jī)。
三咬像,計(jì)算器的狀態(tài)機(jī)設(shè)計(jì)
把信號 PLUS 算撮,MINUS, MULTIPLY 和 DIVIDE合并成一個(gè)高級的信號 OPER (操作數(shù))县昂。這個(gè)變換避免了在兩個(gè)轉(zhuǎn)換(從 operand1 到opEntered 肮柜,和從 result 到 opEntered )上重復(fù)相同的觸發(fā)。
不過倒彰,用戶希望能在任何時(shí)候取消并重新開始审洞。類似的,用戶希望能在任何時(shí)候關(guān)閉計(jì)算器待讳。在下圖的狀態(tài)圖用一種天真的方式加入了這些特征芒澜。一個(gè)較好的方法是把這些共同的狀態(tài)分解成一個(gè)更高一層的狀態(tài) on仰剿,并讓所有的子狀態(tài)通過行為繼承來重用 Cancel 和 OFF 轉(zhuǎn)換。這就是層次狀態(tài)機(jī)可以繼承父類狀態(tài)機(jī)的所有屬性痴晦。
最后再添加正負(fù)號和小數(shù)點(diǎn)浮點(diǎn)計(jì)算南吮,狀態(tài)機(jī)就更加復(fù)雜了,設(shè)計(jì)思路同樣采用繼承狀態(tài)對象阅酪。
四旨袒,小結(jié)
其實(shí)我之前覺得設(shè)計(jì)的比較神奇的GUI框架汁针,其實(shí)也是用的事件驅(qū)動(dòng)加狀態(tài)機(jī)來設(shè)計(jì)术辐,GUI的一個(gè)個(gè)層次界面的容器用的就是層次狀態(tài)機(jī)的設(shè)計(jì),它有繼承的概念施无,也退出的時(shí)候是類似歸遞辉词,退出事件通知就是一層層為容器繪圖。之前我不知道還有層次狀態(tài)機(jī)的設(shè)計(jì)猾骡,最近看了此書后才明白瑞躺,這就是不識廬山真面目,只緣身在此山中吧