亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于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 引言

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

        在面向?qū)ο蟮木幊讨?,如果出現(xiàn)大量的與類(lèi)內(nèi)部狀態(tài)轉(zhuǎn)換有關(guān)的邏輯時(shí),傳統(tǒng)的解決方式為在代碼中增加大量的if…else或者switch等判斷語(yǔ)句。然而,這樣做一方面隨著狀態(tài)的增加代碼可能會(huì)不受控制(比如使用瀏覽器的歷史記錄、手工輸入鏈接以及模擬一次表單提交,等等),從而出現(xiàn)無(wú)法預(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ī)的框架。其主要功能是幫助開(kāi)發(fā)者簡(jiǎn)化狀態(tài)機(jī)的開(kāi)發(fā)過(guò)程,讓狀態(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),簡(jiǎn)稱(chēng)狀態(tài)機(jī),是一種表示有限狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型[4],廣泛應(yīng)用于計(jì)算機(jī)領(lǐng)域。狀態(tài)機(jī)是一種圖形化的同步建模語(yǔ)言,具有并發(fā)性、層次性、良好的優(yōu)先級(jí)搶占機(jī)制和通信機(jī)制[5]。

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

        驅(qū)動(dòng)狀態(tài)機(jī)的是觸發(fā)器,這些觸發(fā)器基于事件或定時(shí)器。可以通過(guò)發(fā)送事件,或者請(qǐng)求當(dāng)前狀態(tài)來(lá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í)體,用來(lái)驅(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):也被稱(chēng)為最終狀態(tài),標(biāo)志著狀態(tài)轉(zhuǎn)換已經(jīng)完成。

        2 Spring StateMachine

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

        Spring StateMachine旨在提供以下功能:

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

        (2)利用注解可以簡(jiǎn)化復(fù)雜的狀態(tài)配置。降低代碼的復(fù)雜度,增加代碼的可讀性,提高開(kāi)發(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)的枚舉類(lèi)。例如:

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

        3 應(yīng)用案例

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

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

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

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

        將所有管理事件抽象出來(lái)得到的枚舉類(lèi)為:

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

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

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

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

        步驟2:設(shè)置為狀態(tài)機(jī)的初始狀態(tài),并配置狀態(tài)變化的流程。將“CREATED”設(shè)置為狀態(tài)機(jī)的初始狀態(tài),并設(shè)置所有狀態(tài)的枚舉類(lè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)移圖以此類(lèi)推進(jìn)行配置。

        步驟4:設(shè)置自定義的持久化狀態(tài)機(jī)Handler以監(jiān)聽(tīng)系統(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)聽(tīng)到時(shí),訂單目標(biāo)狀態(tài)“PICKED”就會(huì)被持久化至數(shù)據(jù)庫(kù)中。

        4 結(jié)語(yǔ)

        在應(yīng)用中合理使用狀態(tài)機(jī)設(shè)計(jì)模式可以增加程序的安全性,簡(jiǎn)化代碼的編寫(xiě),增加代碼的可讀性。Spring StateMachine將狀態(tài)機(jī)模式以框架的形式引入到Web應(yīng)用中,減輕了開(kāi)發(fā)者的壓力,擴(kuò)展了狀態(tài)機(jī)的功能,方便狀態(tài)機(jī)的監(jiān)控以及持久化擴(kuò)展,為開(kāi)發(fā)者提供了更多的選擇。就Spring StateMachine而言,目前迭代的版本不多,并沒(méi)有得到充分的驗(yàn)證,可能還存在一些未知的Bug,相信隨著信息技術(shù)的持續(xù)快速發(fā)展,Spring StateMachine會(huì)迎來(lái)更大的發(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)世代碼
        基于太陽(yáng)影子定位枚舉法模型的研究
        USB開(kāi)發(fā)中易混淆的概念剖析
        FPGA設(shè)計(jì)中狀態(tài)機(jī)安全性研究
        天天躁夜夜躁狠狠是什么心态| 国产亚洲av手机在线观看| 国产女厕偷窥系列在线视频| 欧美亚洲熟妇一区二区三区| 天堂无码人妻精品av一区| 欧美xxxx色视频在线观看| 国产69精品久久久久999小说| 国产精品va在线观看无码| 日本巨大的奶头在线观看| 亚洲一区爱区精品无码| 亚洲AV一二三四区四色婷婷| 国产伦精品一区二区三区四区| 国产成人一区二区三区视频免费蜜| 国产码欧美日韩高清综合一区 | 欧美日韩一二三区高在线| 日本亚洲一级中文字幕| 色噜噜精品一区二区三区| 91亚洲精品久久久中文字幕| 按摩少妇高潮在线一区| 日本视频一区二区三区观看| 精品亚洲第一区二区三区| 国产精品女老熟女一区二区久久夜| 狠狠色欧美亚洲狠狠色www| 亚洲国产精彩中文乱码av| 亚洲国产av玩弄放荡人妇| 奇米影视777撸吧| 亚洲精品久久久久久动漫| 天天狠天天透天干天天| 2017天天爽夜夜爽精品视频 | 日本一区二区精品色超碰| 国产在线观看黄片视频免费| 国产一区二区黄色网页| 国产精品国产三级国产av品爱| 人人妻人人澡人人爽欧美一区双| 18禁无遮拦无码国产在线播放| 国产乱子伦农村叉叉叉| 欧美刺激午夜性久久久久久久| 久久中文字幕久久久久91| 尤物成av人片在线观看| 亚洲无毛成人在线视频| 在线观看视频日本一区二区|