我想将 GUI 实现为状态机。我认为这样做有一些好处和一些缺点,但这不是这个问题的主题。
在阅读了这篇文章之后,我发现了几种用 C++ 建模状态机的方法,我坚持使用 2,但我不知道哪种方法更适合 GUI 建模。
使用以下方法将状态机表示为状态列表:
OnEvent(...);
OnEnterState(...);
OnExitState(...);
从
StateMachine::OnEvent(...)
我将事件转发到CurrentState::OnEvent(...)
此处,决定是否进行转换。在过渡时CurrentState::OnExitState(...)
,我NewState::OnEnterState()
打电话给CurrentState = NewState;
使用这种方法,状态将与动作紧密耦合,但是
State
当我可以从一个状态转到多个状态并且我必须针对不同的转换采取不同的动作时,可能会变得复杂。将状态机表示为具有以下属性的转换列表:
InitialState
FinalState
OnEvent(...)
DoTransition(...)
从
StateMachine::OnEvent(...)
我将事件转发到与状态机中InitialState
具有相同值的所有转换。CurrentState
如果满足转换条件,则循环停止,DoTransition
方法被调用并CurrentState
设置为Transition::FinalState
。使用这种方法
Transition
会非常简单,但转换计数的数量可能会变得非常高。此外,当一个状态接收到事件时,跟踪将执行哪些操作也将变得更加困难。
您认为哪种方法更适合 GUI 建模。您知道其他可能更适合我的问题的表示吗?