状态模式与记忆

时间:2010-01-13 10:20:56

标签: design-patterns domain-driven-design

我在普通状态机中使用状态模式。我希望能够从[ A - > B ],[ B - > C ]和[ A - > ç]。 现在我们的域名有一个新规则,现在我需要从[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 - > 如果 B不是在Context.StateHistoric中]。
  3. 这两种中哪一种更适合使用状态模式的内存? (或其他替代方案2)

    由于

5 个答案:

答案 0 :(得分:3)

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

不要因为它的名字听起来与你喜欢的名字相似而不再遵守设计模式。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

实施状态模式以及Memento pattern

的变体