12

有时需要为对象的状态提供支持。据我了解,有两种方法:

  1. 枚举(简单)
  2. STATE模式(OC原理)

很明显,需要为此目的使用状态模式(我不确定)。

但是阅读我经常面对的其他代码只是枚举而不是状态模式。状态模式有权力吗?

4

2 回答 2

14

通常,ENUM 方法涉及某种状态和转换的表(数组)。而设计模式在对象上实现了相同的效果。

如果您不是指使用 ENUM 的表方法,那么解决方案将需要涉及一个大的 if/else if 块,这是非常难以管理的。参考下面的部分,我认为这个特殊的解决方案很明显是劣等的。

以下是我将列出的每个优点和缺点

枚举表

优点:

  • 由于表是在一个地方定义的,因此更容易查看所有状态和转换

缺点:

  • 状态和转换更加硬编码,需要更多代码更改来扩展

设计模式

优点:

  • 通过添加新对象更容易扩展新状态。(开/关原则)
  • 更容易确保所有信号都被状态处理,因为基类应该将信号定义为抽象函数。
  • 通过从状态派生来更容易扩展特定状态的行为。状态模式应该将特定状态的行为放在一个对象中。

缺点:

  • 通过查看代码更难看到所有状态及其关系,因为它们分散在几个不同的类中。
  • 最终可能会创建数量难以管理的对象。但将此与相应 ENUM 解决方案所需的相应 if/else 块进行比较。
于 2012-05-25T10:20:00.983 回答
11

为什么我们使用状态模式?去除条件逻辑重复,用多态替换条件代码。

我们什么时候有条件逻辑重复?当我们有许多依赖于状态的动作时,您必须在每个动作中复制条件逻辑。当您有许多状态时,它变得非常烦人。此外,代码重复意味着您应该在添加新状态时更新重复代码的每个副本。

因此,如果我没有重复的条件逻辑,我宁愿使用基于枚举的状态,而不是创建具有许多状态类的新类层次结构。有时我什至更喜欢条件逻辑重复:例如,当我有很多状态,但只有很少的状态相关动作时。在这种情况下,我更喜欢有两个 switch 块而不是创建十个新类。

于 2012-05-25T11:51:34.813 回答