據我所知,State pattern
可以用來模擬對象的行爲取決於狀態和Context
可以具有的各種狀態封裝在代表State
接口的具體類中。我不清楚的是國家轉型如何在這種模式中發生。個人states
知道並決定誰跟隨他們,或者是Context
決定下一個將會獲得哪個州?誰在狀態模式中定義狀態轉換?
11
A
回答
9
從GOF設計模式一書(這是那裏的執行部分):
1.誰來定義的狀態轉換?狀態模式沒有指定哪個參與者定義了狀態轉換的標準。如果標準是固定的,那麼它們可以完全在上下文中實施。但是,通常情況下更爲靈活和適當的是讓國家自己指定繼承國以及何時進行轉型。這需要在Context中添加一個接口,讓State對象明確地設置Context的當前狀態。
以這種方式分散轉換邏輯可以很容易地通過定義新的狀態子類來修改或擴展邏輯。分散化的一個缺點是一個州的子類將至少有另一個子類的知識,這會引入子類之間的實現依賴關係。
4
可能是一個比較具體的例子可以澄清。我希望我正確理解它
假設洗衣機有兩種狀態(開,關)。繼GoF的詞彙:
- 語境=>洗衣機
- 國家=> WashingMachineState
- 具體狀態=> StateOn,StateOff
對於狀態轉換,通過狀態的子類(在我們的例子StateOn和StateOff)我們需要一種方法來改變狀態上下文:
class WashingMachine {
WashingMachineState state;
...
protected void setState(WashingMachineState newState) {
state = newState;
}
someMethod() {
...
state.pushStartButton(this);
...
}
}
abstract class WashingMachineState {
protected void run();
protected void pushStartButton(WashingMachine wm);
}
class StateOn extends WashingMachineState {
...
void pushStartButton(WashingMachine wm) {
wm.setState(new StateOff())
}
}
class StateOff extends WashingMachineState {
...
void pushStartButton(WashingMachine wm) {
wm.setState(new StateOn())
}
}
只要保持記住有幾種方式來實現它,創意幫助!
相關問題
- 1. 在實現狀態模式時將鍵綁定應用於狀態轉換
- 2. REST - 模型狀態轉換
- 3. UML狀態機子狀態轉換
- 4. EJB Spec 3.1有狀態轉換狀態
- 5. Angularjs狀態轉換
- 6. Flex狀態轉換
- 7. 使用狀態模式解耦狀態
- 8. Flex中的狀態轉換
- 9. 非模態「狀態」形式
- 10. 在轉換中製作「狀態」fsm package更「有狀態」
- 11. 可以在狀態機中進行狀態轉換嗎?
- 12. 狀態模式C++
- 13. SAX狀態模式
- 14. GetRecurringPaymentsProfileDetails狀態定義
- 15. 如何使用狀態模式的對象轉換到下一個狀態?
- 16. Java中的狀態模式
- 17. C++中的模式狀態
- 18. 春季狀態機定義選擇狀態在uml中
- 19. 在android中設置自定義切換狀態的禁用狀態
- 20. 狀態模式 - Django模型
- 21. ASM:有狀態轉換
- 22. 狀態機反射轉換
- 23. 協議狀態和轉換
- 24. 狀態機定時器自我轉換
- 25. 在佔美娜轉換的狀態,ID和日期公式狀態序列
- 26. 狀態模式 - 在每個轉換之前執行操作
- 27. 設計模式:Rails中子狀態父項的聚合狀態
- 28. 狀態模式中的最大狀態數
- 29. Azure自定義腳本停留在轉換狀態
- 30. Java文檔狀態模式?