我目前正在制作一個快遞服務(wù)網(wǎng)頁 - 客戶可以放棄訂單 - 快遞可以更改訂單的狀態(tài)(新的,接受的,交付中的,交付的,取消的)。我使用狀態(tài)設(shè)計模式來描述這一點,因為它對我來說最有意義。我想將所有訂單保存在關(guān)系數(shù)據(jù)庫中(我使用的是 H2 和 Hibernate/JPA) - 但我不知道如何在加載對象時恢復(fù)狀態(tài)。想到了兩種方法:為每個狀態(tài)創(chuàng)建一個表,并將對象保存在與其狀態(tài)對應(yīng)的表中(我不知道如何(如果可能的話)實現(xiàn)這一點)。給訂單類一個與其所處狀態(tài)相對應(yīng)的屬性 - 然后在再次加載對象時將對象的內(nèi)部狀態(tài)設(shè)置為等于相關(guān)狀態(tài)。但這不會破壞狀態(tài)設(shè)計模式的目的嗎?目標(biāo)不是最小化 if/else 語句和開關(guān)墻嗎?我應(yīng)該怎么辦?有沒有更好的方法來解決這個問題?
3 回答

幕布斯6054654
TA貢獻(xiàn)1876條經(jīng)驗 獲得超7個贊
這在很大程度上取決于您的用例。
您是否計劃擁有數(shù)以百萬計的行?那么每個州都有一張桌子實際上是有道理的。這稱為分區(qū),通常,您的應(yīng)用程序不會知道您有一組表。但是你的數(shù)據(jù)庫會。我認(rèn)為情況并非如此。
第二個選擇是聲音,如果它是一個玩具項目。狀態(tài)設(shè)計模式的目標(biāo)不是減少 if/else 語句的數(shù)量。根據(jù)我的經(jīng)驗,它通常會產(chǎn)生更多的 if/else 語句。目標(biāo)是封裝狀態(tài)轉(zhuǎn)換。也就是說,在代碼周圍使用 if/else,很容易將您的訂單從 Created 狀態(tài)移動到 Completed 狀態(tài),而實際上它沒有被處理。狀態(tài)設(shè)計模式有助于解決這個問題。
但實際上還有第三種選擇,通常用于現(xiàn)實生活中的系統(tǒng)。有 OrderStates 表,它將保存訂單所在的所有狀態(tài)。每次訂單在狀態(tài)之間移動時創(chuàng)建一行。這將使您能夠真正了解系統(tǒng)中發(fā)生的情況。
添加回答
舉報
0/150
提交
取消