2011-03-07 48 views
6

我從典型實施State pattern小號收集這是什麼:狀態模式是否準確表示方法?

問題:表示對象Ø,基於其當前狀態,其行爲會改變。
解決方案:
1.讓小號,該目的ö內另一個目的,表示狀態
2.對象小號將調用的ö
3.對象的適當的操作S將決定對象的下一個狀態O

我的關注主要是w第#3。狀態轉換表基本上分佈在所有狀態中。我看到這些解決方案變得非常繁瑣,難以快速管理。這些國家不是指示性的,而是有關狀態機的太多信息。
即使#2困擾我,我想這是相當合理的(Moore machine。)我已經看到唯一的問題出現在錯誤修復/調試:代碼導航/理解變得很難,直到一個提交所有的狀態映射到內存。

下面的實施會更精確嗎?
將狀態表示爲枚舉,對象根據枚舉所持有的值決定動作。 state transitions位於表格(δ,狀態轉換函數)中,該表格是當前狀態到下一狀態的映射。這state transition table也持有要執行的動作(Mealy machine

+3

是的。這真是一種模式。請修正標題以反映您的實際問題。 – 2011-03-07 17:00:35

+0

你所描述的是另一種實現狀態機的方式(也是我見過的常見狀態),但它不是狀態機模式(從GoF模式手冊引用) – nos 2011-03-07 17:04:58

+0

+1,謝謝。更新了標題。 – CMR 2011-03-07 17:07:17

回答

1

我不知道你爲什麼認爲國家模式只能代表摩爾機器。

void SleepingState::alarm() 
{ 
    kick_alarm_clock(); 
    set_state(new GrumpyState()); 
} 

我們選擇了基於這兩個國家(SleepingState)輸出(kick_alarm_clock)和事件(警報),這使得它米利機。

你的替代方案確實有效並且很受歡迎(還有其他)。由於幾種方法都足以實現機器邏輯,因此您可以根據「設計」或個人品味的其他考慮做出決定。選擇狀態模式的設計理由可能是,如果你認爲你經常會添加新的狀態,或者某些狀態似乎足以保證繼承關係。我傾向於選擇美學:我只有在機器相當密集的情況下才使用狀態模式 - 即對於大多數{狀態,事件}對來說,都有一些不平凡的動作轉換。如果機器相當稀疏,那麼所有空方法都讓我感到尷尬。

+0

我只是說#2沒有錯,不是它可以只有代表摩爾機器。'kick_alarm_clock()'爲+1 – CMR 2011-03-07 20:32:06