• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于Spring StateMachine的有限狀態(tài)機(jī)應(yīng)用研究

      2018-11-20 11:54:14吳德許凡
      現(xiàn)代計(jì)算機(jī) 2018年30期
      關(guān)鍵詞:枚舉狀態(tài)機(jī)代碼

      吳德,許凡

      (三江學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院,南京210012)

      0 引言

      近年來,基于“互聯(lián)網(wǎng)+”模式的軟件系統(tǒng)變得越來越精致復(fù)雜[1],軟件需求和軟件架構(gòu)的多元化,導(dǎo)致軟件開發(fā)過程中建模難度增加[2],其重要因素之一就是系統(tǒng)狀態(tài)隨著復(fù)雜的交互過程而變得更加多樣化。

      在面向?qū)ο蟮木幊讨?,如果出現(xiàn)大量的與類內(nèi)部狀態(tài)轉(zhuǎn)換有關(guān)的邏輯時(shí),傳統(tǒng)的解決方式為在代碼中增加大量的if…else或者switch等判斷語句。然而,這樣做一方面隨著狀態(tài)的增加代碼可能會(huì)不受控制(比如使用瀏覽器的歷史記錄、手工輸入鏈接以及模擬一次表單提交,等等),從而出現(xiàn)無法預(yù)期的狀態(tài)轉(zhuǎn)換錯(cuò)誤,導(dǎo)致程序運(yùn)行異常,給用戶造成損失;另一方面,這種做法將對(duì)象狀態(tài)的轉(zhuǎn)換與業(yè)務(wù)邏輯進(jìn)行了緊密耦合,隨著規(guī)模的增大不利于系統(tǒng)的后期維護(hù)。

      狀態(tài)機(jī)模式是處理這些情況的有效方法,它能處理任何順序的事件,并能提供有意義的響應(yīng)——即使這些事件發(fā)生的順序和預(yù)計(jì)的不同。

      Spring StateMachine是Spring提供的一個(gè)有限狀態(tài)機(jī)的框架。其主要功能是幫助開發(fā)者簡化狀態(tài)機(jī)的開發(fā)過程,讓狀態(tài)機(jī)結(jié)構(gòu)更加層次化[3]。Spring StateMachine框架可將狀態(tài)機(jī)模式較為輕松地加入程序之中,提高編程的一致性和規(guī)范性。

      1 有限狀態(tài)機(jī)

      有限狀態(tài)機(jī)(Finite State Machine,F(xiàn)SM),簡稱狀態(tài)機(jī),是一種表示有限狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型[4],廣泛應(yīng)用于計(jì)算機(jī)領(lǐng)域。狀態(tài)機(jī)是一種圖形化的同步建模語言,具有并發(fā)性、層次性、良好的優(yōu)先級(jí)搶占機(jī)制和通信機(jī)制[5]。

      狀態(tài)機(jī)能采取某種操作來響應(yīng)一個(gè)外部事件。具體采取的操作不僅取決于接收到的事件,還取決于各個(gè)事件的相對(duì)發(fā)生順序。之所以能做到這一點(diǎn),是因?yàn)闄C(jī)器能跟蹤一個(gè)內(nèi)部狀態(tài),它會(huì)在收到事件后進(jìn)行狀態(tài)更新。也就是說,為一個(gè)事件而采取的響應(yīng)行動(dòng)不僅取決于事件本身,還取決于其內(nèi)部狀態(tài)。因此,任何邏輯都可建模成一系列事件/狀態(tài)組合。

      驅(qū)動(dòng)狀態(tài)機(jī)的是觸發(fā)器,這些觸發(fā)器基于事件或定時(shí)器??梢酝ㄟ^發(fā)送事件,或者請求當(dāng)前狀態(tài)來與狀態(tài)機(jī)進(jìn)行交互。

      狀態(tài)機(jī)中的幾個(gè)重要概念:

      (1)狀態(tài):用于模擬事物在條件不變時(shí)情況相對(duì)穩(wěn)定的抽象概念,是狀態(tài)機(jī)的主要實(shí)體,狀態(tài)的變化主要由事件驅(qū)動(dòng)。

      (2)事件:向狀態(tài)機(jī)發(fā)送的實(shí)體,用來驅(qū)動(dòng)狀態(tài)機(jī)各種各樣的變化。

      (3)行為:象征著從“源狀態(tài)”向“目標(biāo)狀態(tài)”的轉(zhuǎn)換,伴隨著事件的發(fā)送,行為會(huì)進(jìn)行特定的響應(yīng),實(shí)現(xiàn)對(duì)應(yīng)的功能。

      (4)初始狀態(tài):狀態(tài)機(jī)被創(chuàng)建時(shí)的特殊狀態(tài),總是伴隨著狀態(tài)機(jī)的初始化。

      (5)結(jié)束狀態(tài):也被稱為最終狀態(tài),標(biāo)志著狀態(tài)轉(zhuǎn)換已經(jīng)完成。

      2 Spring StateMachine

      Spring StateMachine是Spring提供給應(yīng)用程序開發(fā)人員使用狀態(tài)機(jī)模型的一款輕量級(jí)框架。該框架提供了一整套與狀態(tài)機(jī)概念一一對(duì)應(yīng)的工具類,用于模仿或者實(shí)現(xiàn)狀態(tài)機(jī)中每個(gè)實(shí)體對(duì)應(yīng)的功能或者組件。

      Spring StateMachine旨在提供以下功能:

      (1)提供易于使用的、扁平的狀態(tài)機(jī)實(shí)例[6]。簡化狀態(tài)機(jī)構(gòu)建的操作,使得開發(fā)人員更加容易地獲取狀態(tài)機(jī)對(duì)象。

      (2)利用注解可以簡化復(fù)雜的狀態(tài)配置。降低代碼的復(fù)雜度,增加代碼的可讀性,提高開發(fā)效率。

      (3)提供事件、行為的操作和使用。事件的觸發(fā)同時(shí)伴隨行為的發(fā)生,可以方便設(shè)置行為的具體內(nèi)容。

      (4)程序運(yùn)行安全的適配器。保證程序安全運(yùn)行,不會(huì)出現(xiàn)預(yù)料外的狀態(tài)改變。

      Spring StateMachine配置流程如圖1所示。

      圖1 Spring StateMachine配置流程圖

      使用者首先需要按照狀態(tài)機(jī)模式的概念抽象出自己所需要的狀態(tài)以及事件。并為其定義好對(duì)應(yīng)的枚舉類。例如:

      根據(jù)狀態(tài)和事件進(jìn)行配置,然后創(chuàng)建狀態(tài)機(jī),獲取狀態(tài)機(jī)主要有通過狀態(tài)機(jī)生成器和使用注解自動(dòng)注入兩種方式。每當(dāng)事件發(fā)送時(shí),狀態(tài)機(jī)都會(huì)監(jiān)聽到,并且改變其對(duì)應(yīng)的狀態(tài),同時(shí)伴隨行為的發(fā)生。也可以自定義監(jiān)聽器以滿足特定的需求。

      3 應(yīng)用案例

      本案例在電商訂單管理系統(tǒng)中加入Spring State Machine框架,嚴(yán)格控制訂單狀態(tài)走向。訂單最主要的狀態(tài)可以抽象為CREATED(已下單)、PICKED(已揀貨)、DELIVERED(已出庫)、SENT(已發(fā)貨)、RE?CEIVED(已收貨),根據(jù)具體場景還可能擴(kuò)展為“已支付”、“已退貨”等。狀態(tài)遷移圖如圖2所示。

      圖2 狀態(tài)轉(zhuǎn)移圖

      系統(tǒng)采用Spring Boot框架進(jìn)行搭建,使用Maven框架進(jìn)行依賴管理,利用Spring MVC,實(shí)現(xiàn)傳統(tǒng)的MVC(Model View Controller)模式,數(shù)據(jù)庫持久層框架使用MyBatis,數(shù)據(jù)庫使用MySQL。

      利用Spring StateMachine框架創(chuàng)建狀態(tài)機(jī),將訂單所有的狀態(tài)抽象出來得到的狀態(tài)枚舉類為:

      將所有管理事件抽象出來得到的枚舉類為:

      將狀態(tài)和事件交由狀態(tài)機(jī)對(duì)象進(jìn)行管理,在MVC的Controller層以及Service層發(fā)送事件,狀態(tài)機(jī)將觸發(fā)事件所對(duì)應(yīng)的行為,將訂單狀態(tài)持久化存入數(shù)據(jù)庫中。總體框架如圖3所示。

      圖3 系統(tǒng)技術(shù)架構(gòu)圖

      狀態(tài)機(jī)配置的具體步驟如下:

      步驟1:定義狀態(tài)機(jī)的狀態(tài)和事件集合,將抽象好的狀態(tài)和事件分別創(chuàng)建對(duì)應(yīng)的枚舉類。根據(jù)圖2的狀態(tài)轉(zhuǎn)移圖,對(duì)應(yīng)的枚舉類如下:

      步驟2:設(shè)置為狀態(tài)機(jī)的初始狀態(tài),并配置狀態(tài)變化的流程。將“CREATED”設(shè)置為狀態(tài)機(jī)的初始狀態(tài),并設(shè)置所有狀態(tài)的枚舉類。

      步驟3:配置狀態(tài)變化的流程,例如:將“CREAT?ED”設(shè)置為源狀態(tài),將“PICKED”設(shè)置為目標(biāo)狀態(tài),并關(guān)聯(lián)事件“PICK”,這樣當(dāng)狀態(tài)機(jī)接收到狀態(tài)為源狀態(tài)“CREATED”的訂單以及事件“PICK”時(shí)就會(huì)自動(dòng)獲取訂單的目標(biāo)狀態(tài)“PICKED”,根據(jù)狀態(tài)轉(zhuǎn)移圖以此類推進(jìn)行配置。

      步驟4:設(shè)置自定義的持久化狀態(tài)機(jī)Handler以監(jiān)聽系統(tǒng)內(nèi)部訂單的狀態(tài)轉(zhuǎn)移,并設(shè)置伴隨狀態(tài)轉(zhuǎn)移觸發(fā)的行為。當(dāng)事件被發(fā)送時(shí),行為也會(huì)同時(shí)發(fā)生,在行為中對(duì)訂單狀態(tài)的改變進(jìn)行持久化處理,例如:當(dāng)“PICK”事件被監(jiān)聽到時(shí),訂單目標(biāo)狀態(tài)“PICKED”就會(huì)被持久化至數(shù)據(jù)庫中。

      4 結(jié)語

      在應(yīng)用中合理使用狀態(tài)機(jī)設(shè)計(jì)模式可以增加程序的安全性,簡化代碼的編寫,增加代碼的可讀性。Spring StateMachine將狀態(tài)機(jī)模式以框架的形式引入到Web應(yīng)用中,減輕了開發(fā)者的壓力,擴(kuò)展了狀態(tài)機(jī)的功能,方便狀態(tài)機(jī)的監(jiān)控以及持久化擴(kuò)展,為開發(fā)者提供了更多的選擇。就Spring StateMachine而言,目前迭代的版本不多,并沒有得到充分的驗(yàn)證,可能還存在一些未知的Bug,相信隨著信息技術(shù)的持續(xù)快速發(fā)展,Spring StateMachine會(huì)迎來更大的發(fā)展空間。

      猜你喜歡
      枚舉狀態(tài)機(jī)代碼
      基于理解性教學(xué)的信息技術(shù)教學(xué)案例研究
      速讀·上旬(2022年2期)2022-04-10 16:42:14
      一種高效的概率圖上Top-K極大團(tuán)枚舉算法
      基于有限狀態(tài)機(jī)的交會(huì)對(duì)接飛行任務(wù)規(guī)劃方法
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      基于太陽影子定位枚舉法模型的研究
      USB開發(fā)中易混淆的概念剖析
      FPGA設(shè)計(jì)中狀態(tài)機(jī)安全性研究
      晋城| 分宜县| 白银市| 全椒县| 岳普湖县| 阳新县| 榆树市| 洪雅县| 灵丘县| 青州市| 横山县| 九龙城区| 民权县| 阿克| 凌源市| 安丘市| 海淀区| 敖汉旗| 海城市| 南汇区| 济宁市| 大兴区| 凤台县| 太保市| 阿城市| 乐东| 景东| 泽库县| 桦南县| 盘山县| 隆化县| 陆丰市| 桐柏县| 郸城县| 淮北市| 阿克陶县| 深水埗区| 微山县| 赫章县| 临朐县| 丹凤县|