首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >状态模式与ENUM

状态模式与ENUM
EN

Stack Overflow用户
提问于 2012-05-25 09:47:18
回答 2查看 4.2K关注 0票数 14

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

  1. ENUM (简单)
  2. 状态模式(OC原理)

显然,有必要为此目的使用State模式(我不确定)。

但是,阅读其他代码时,我通常只面对枚举,而不是状态模式。国家模式有权力吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-25 11:51:34

为什么我们要使用状态模式?若要删除条件逻辑重复,并将条件代码替换为多态,请执行以下操作。

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

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

票数 13
EN

Stack Overflow用户

发布于 2012-05-25 10:20:00

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

如果您没有使用ENUM引用表方法,那么解决方案需要包含一个很大的if/else If块,这是非常难以管理的。关于下面这一节,我认为很明显,这个特定的解决方案是次等的。

以下是我要列出的每一种方法的优缺点

ENUM表

优点:

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

缺点:

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

设计模式

优点:

  • 通过添加新对象更容易使用新状态进行扩展。(打开/关闭Principle)
  • Easier,以确保所有信号都由状态处理,因为基类应该将信号定义为抽象functions.
  • Easier,通过从状态派生来扩展特定状态的行为)。状态模式应该将特定状态的行为放在一个对象中。

缺点:

通过查看代码,更难看到所有的状态及其关系,因为它们分散在几个不同的classes.

  • Could中,最终导致无法管理的对象数量。但是,将其与相应的ENUM解决方案所需的if/ENUM块进行比较。
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10752157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档