2010-01-13 54 views
4

我在正常状态机中使用状态模式。我希望能够从[A→B],[B→C]和[A→C]。 现在我们的域名有了新的规则,现在我需要从[C - > A]也去,但只有如果我从来没有在B之前。 所以我们有状态与内存。有两个可能的解决方案:状态模式与内存

  1. 创建乙后,一个新的国家CB至极意味着C,并有这些规则[甲 - >乙],[乙 - > CB],[ A - >ç],[ç - >一个]
  2. 使用的事实,我们的环境已经与以前的状态的列表(可以称之为StateHistoric),当跃迁的日期(国家历史也是我们客户的领域要求),然后使用这些规则[A - >乙],[乙 - “ç],[A - >Ç],[Ç - >甲如果B不在Context.StateHistoric]。

这两者中哪一个是使用状态模式更正确的方式? (或另一种替代这些2)

由于

+0

如果条件变得更复杂,例如,如果现在我可以从C-> A去,只有当我从未去过B TWICE时,那么如果我选择了解决方案编号1,所需状态的数量会增加,所以它不是一个可行的解决方案,解决方案二会更容易适应,因为我只需要计算历史中B的数量。所以为了灵活性,我更倾向于选择解决方案2。 – 2010-01-17 22:10:40

回答

2

如果它具有存储器那么它不是一个真正的状态机。如果你想保持这个身份,选项1是正确的。

3

转到第二个解决方案。它更容易理解并且更容易扩展。

不要因为它的名字听起来类似于你喜欢做的事而烦扰设计模式。

0

选项#2的作品。您的历史记录列表有多大?如果通过列表搜索变成一个漫长的过程,那么我会选择#3:添加一个布尔标志到你的上下文中,名为像visitedStateB。初始化时将此标志设置为false。设置标志为true,当一个转换进入状态B.

1

带有内存的状态机确实存在,它们被称为下推自动机... 这个想法是有一个堆栈,你可以读取状态并写入走出国家。 关于状态设计模式,我想它可以在上下文中作为Memento实现。