状态模式是否准确地代表了方法?

CMR*_*CMR 6 design-patterns

我从状态模式典型实现中收集到是:

问题: 表示对象O,其行为根据其当前状态进行更改.
解决方案:
1.设S,此对象O中的另一个对象表示状态
2.对象S将调用O
3 的相应操作.对象S将决定对象O的下一个状态

我关心的主要是#3.状态转换表基本上分布在所有状态.我已经看到这些解决方案很快就会变得很麻烦.这些状态不是指示器,而是包含有关状态机的过多信息.
即使#2困扰我,我想它是相当合理的(摩尔机器.)我看到的唯一问题出现在错误修复/调试过程中:代码导航/理解变得困难,直到将所有状态映射提交到内存.

以下实施会更精确吗?
将状态表示为枚举,并且对象基于枚举所持有的值来决定操作.的state transitions是在表中(δ,一个状态转换函数),其当前状态的地图至下一状态.这state transition table也保持了要执行的动作(Mealy机器)

fiz*_*zer 1

我不知道你为什么认为状态模式只能代表摩尔机。

void SleepingState::alarm()
{
    kick_alarm_clock();
    set_state(new GrumpyState());
}
Run Code Online (Sandbox Code Playgroud)

我们根据状态 (SleepingState) 和事件 (alarm) 选择输出 (kick_alarm_clock),这使其成为 Mealy 机器。

您的替代方案确实有效且受欢迎(还有其他替代方案)。由于几种方法都足以实现机器逻辑,因此您可以根据“设计”或个人品味的其他考虑因素做出决定。选择状态模式的设计原因可能是,如果您认为经常会添加新状态,或者某些状态看起来足够相似以保证继承关系。我倾向于选择美观:仅当机器相当密集时我才使用状态模式 - 即大多数{状态,事件}对都有重要的动作和转换。如果机器相当稀疏,我会对所有空方法感到尴尬。