4

我在普通状态机中使用状态模式。我希望能够从 [ A -> B ]、[ B -> C ] 和 [ A -> C ] 出发。现在我们的域有一个新规则,现在我也需要从 [C -> A] 出发,但前提是我以前从未去过 B。所以我们有带有记忆的状态。有两种可能的解决方案:

  1. 创建一个新的状态CB意味着C 在 B 之后,并具有这些规则 [ A -> B ]、[ B -> CB ]、[ A -> C ]、[ C -> A ]
  2. 使用我们的 Context 有一个包含先前状态的列表(我们称之为 StateHistoric)和进行转换的日期(状态历史也是我们客户的域要求)的事实,然后使用这些规则 [ A -> B ]、[ B -> C ]、[ A -> C ]、[ C -> A如果B不在 Context.StateHistoric 中]。

两者中哪一个是为状态模式使用内存的更正确方法?(或这两个的另一种选择)

谢谢

4

5 回答 5

3

寻求第二个解决方案。它更容易理解,也更容易扩展。

不要仅仅因为它的名字听起来和你喜欢做的事情相似就去坚持设计模式。

于 2010-01-13T10:28:47.597 回答
2

如果它有内存,那么它就不是真正的状态机。如果您想保持此身份,选项 1 是正确的。

于 2010-01-13T10:24:01.353 回答
1

确实存在具有内存的状态机,它们被称为下推自动机......这个想法是有一个堆栈,您可以读取进入状态并写入退出状态。关于状态设计模式,我想它可以在上下文中实现为备忘录。

于 2010-01-16T01:44:49.973 回答
0

选项 #2 有效。你的历史清单有多大?如果在列表中搜索成为一个漫长的过程,那么我会选择选项#3:在您的上下文中添加一个布尔标志,称为visitedStateB。在初始化时将此标志设置为 false。当转换将您带入状态 B 时,将标志设置为 true。

于 2010-01-13T23:04:41.913 回答
0

与Memento 模式的变体一起实现状态模式?

于 2012-03-20T01:28:58.220 回答