說我們有一個(英國)交通燈模擬應用和交通燈都有相關的有限狀態機定義爲類: -有限狀態機可以在不破壞FSM封裝的情況下使用持久性嗎?
* --> RED --> RED_AMBER --> GREEN --> AMBER --> RED --> ...
(repeat until the proverbial cows make an appearance)
在建設交通燈的狀態是RED 幾樣時間觸發導致狀態改變。
在應用程序中可能存在像(除去從點帶走任何代碼)一些代碼...
TrafficLight trafficLightsAtBigJunction = new TrafficLight(); // state = RED
trafficLightsAtBigJunction.setState(TrafficLightState.RED_AMBER);
trafficLightsAtBigJunction.setState(TrafficLightState.GREEN);
trafficLightsAtBigJunction.setState(TrafficLightState.AMBER);
trafficLightsAtBigJunction.setState(TrafficLightState.RED);
trafficLightsAtBigJunction.setState(TrafficLightState.RED_AMBER);
:
:
:
的癥結在於,使用狀態模式來實現狀態機,如果我們這樣做
TrafficLight trafficLightsAtBigJunction = new TrafficLight(); // state = RED
trafficLightsAtBigJunction.setState(TrafficLightState.GREEN); // Exception!!!!!
由於它是非法的狀態移動而引發異常(通過我們的設計)。這就是我們想要的。世界上的一切都很好。
但是,如果我們繼續堅持交通信號燈,而且恰好處於state = AMBER的話,那麼就會出現問題。當我們的用戶在3天后回來觀看真棒交通燈模擬時,它會從一些(關心)持久性商店中的當前狀態恢復。
我們如何讓紅綠燈實例處於狀態AMBER而不破壞狀態模式在這裏提供的封裝?
似乎有2個選擇: - (1)創建一個新的實例並運行通過相關國家 (2)提供一個特殊的方法設置狀態,無論我們想的是,按照慣例,僅在從某個持久性存儲中讀取後才能使用。例如與
trafficLight.setStateAfterReadingFromPersistanceSource(AMBER);
問題(1)我看到的是,有很可能的副作用經歷的狀態運行時,我不想,加上邏輯可以根據不同的狀態機是相當複雜
問題與(2)顯然它只是按照慣例工作,所以可能引入錯誤而不知道何時被錯誤地使用。更重要的是,它幾乎打破了所有你最好的模式封裝,這是你想要的東西。
的問題是持續性的技術無關 - 與ORM,文件化,系列化等同樣的問題
我假設這裏有一個解決方案,但我想不出自己一個和我的谷歌搜索技巧都不足以。
任何指針都會很棒。
是的,所以我想這是一個更簡潔的方式來提出我的問題。就我所見,似乎是一種二分法。你有你的「正常」封裝流程,但由於持久維度需要某種「走出去」。 –