我从State pattern s 的典型实施中收集到的是:
问题:代表一个对象 O ,其行为会根据当前状态改变。
解决方案:
1.让 S ,此对象 O 中的另一个对象代表状态
2.对象 S 将调用 O 的适当操作
3.对象 S 将决定对象的下一个状态 O
我主要关注#3
。状态转换表基本上分布在所有状态。我已经看到这些解决方案很快就会变得很麻烦。这些状态不是指示器,而是包含有关状态机的过多信息
尽管#2
困扰我,但我认为这是相当合理的(Moore machine。)我在bug修复/调试过程中遇到的唯一问题是:在一个提交所有状态映射之前,代码导航/理解变得困难记忆。
以下实施会更精确吗?
将状态表示为枚举,并且对象基于枚举所持有的值来决定操作。 state transitions
位于表(δ,状态转换函数)中,该表是当前状态到下一状态的映射。此state transition table
还包含要执行的操作(Mealy machine)
答案 0 :(得分:1)
我不知道为什么你认为State模式只能代表Moore机器。
void SleepingState::alarm()
{
kick_alarm_clock();
set_state(new GrumpyState());
}
我们根据状态(SleepingState)和事件(警报)选择输出(kick_alarm_clock),这使它成为Mealy机器。
您的替代方案确实有效且受欢迎(还有其他方式)。由于有几种方法都足以实现机器逻辑,因此您可以根据“设计”或个人品味的其他考虑因素做出决策。如果您认为通常会添加新状态,或者某些状态看起来足够相似以保证继承关系,那么设计理由更倾向于使用状态模式。我倾向于选择美学:只有当机器相当密集时才会使用状态模式 - 即存在非常重要的行为&大多数{state,event}对的转换。如果机器相当稀疏,我会因为所有空方法而感到尴尬。