Kata17:處理帶狀態(tài)的規(guī)則

(Kata17地址)[http://codekata.com/kata/kata17-more-business-rules/]

上一個(gè)Kata我們通過(guò)DSL解決了復(fù)雜規(guī)則的實(shí)現(xiàn)方法,這個(gè)Kata我們需要處理另一種規(guī)則:帶狀態(tài)的規(guī)則。

什么叫帶狀態(tài)的規(guī)則呢?顯然重點(diǎn)是“狀態(tài)”,看下面的例子:

1、商品加入購(gòu)物車,如果點(diǎn)擊下單進(jìn)入2
2、下單,如果點(diǎn)擊付款進(jìn)入3,如果取消訂單進(jìn)入4
3、付款,如果付款成功進(jìn)入5,如果付款失敗進(jìn)入6
4、取消訂單
5、商品出庫(kù),發(fā)貨,如果簽收進(jìn)入7,如果拒收進(jìn)入8
6、提醒顧客再次付款
7、訂單結(jié)束
8、售后負(fù)責(zé)處理

這是一個(gè)簡(jiǎn)化版的在線購(gòu)物流程,我們可以看到每個(gè)規(guī)則,或者說(shuō)每個(gè)階段都有一個(gè)狀態(tài),不同狀態(tài)之間又有一些關(guān)聯(lián)關(guān)系,我們的任務(wù)就是要設(shè)計(jì)一套系統(tǒng),可以實(shí)現(xiàn)帶狀態(tài)的規(guī)則并容易維護(hù)。

思路

我就直接說(shuō)思路吧。

這里其實(shí)本質(zhì)上是一個(gè)狀態(tài)機(jī),不明白的同學(xué)可以搜一下什么是狀態(tài)機(jī)。狀態(tài)機(jī)可以解決狀態(tài)以及狀態(tài)之間的跳轉(zhuǎn)關(guān)系,有了狀態(tài)機(jī)我們就可以實(shí)現(xiàn)從一個(gè)狀態(tài)跳轉(zhuǎn)到另一個(gè)狀態(tài)。

但是狀態(tài)機(jī)只是基礎(chǔ),我們?cè)诖嘶A(chǔ)之上還需要將每個(gè)規(guī)則或者說(shuō)每個(gè)狀態(tài)抽象成兩個(gè)部分,第一部分是狀態(tài)對(duì)應(yīng)的行為,第二部分是狀態(tài)跳轉(zhuǎn)。

狀態(tài)對(duì)應(yīng)的行為就是跳轉(zhuǎn)到本狀態(tài)后需要做的事情,比如2中的下單,比如3中的付款,可以看作是“一次性”的,跳轉(zhuǎn)到本狀態(tài)后就執(zhí)行。

狀態(tài)跳轉(zhuǎn)就是從本狀態(tài)跳轉(zhuǎn)到其他狀態(tài),這一般會(huì)是一個(gè)類似if語(yǔ)句的東西,不過(guò)跳轉(zhuǎn)的條件多種多樣,單獨(dú)抽象成一個(gè)部分可以更好地進(jìn)行隔離,把條件的多樣性封裝起來(lái)。

如果用面向?qū)ο髞?lái)說(shuō)的話就是三個(gè)類,Rule、Action和TransferCondition,思路很清晰了,具體的代碼就不寫(xiě)了(我一點(diǎn)都不懶?。蠹腋信d趣的可以動(dòng)手練習(xí)一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,007評(píng)論 25 709
  • 你說(shuō)過(guò)了一個(gè)小時(shí)
    帥臉怪閱讀 117評(píng)論 0 0
  • 七律/一串紅 作者:心博、圖片:網(wǎng)絡(luò) 遠(yuǎn)望嫣然一片霞,近看串串結(jié)紅花。 夕陽(yáng)照耀佳人面,圣火光臨方丈裟。 爆仗千株...
    心博1閱讀 1,375評(píng)論 0 1

友情鏈接更多精彩內(nèi)容