2016-02-12 144 views
2

我正在研究使用State模式将我的代码中的大switch语句转换为更易于管理的块。我可以得到关于国家行为模式的一些说明吗?

我一直在阅读关于它的Design Patterns book,并且还在看教程点示例here

该示例中的代码对我来说看起来不对,因为作者从Context以外调用State功能。那是对的吗?

这是我的理解,它应该是状态的包装的上下文,并且State更改应该最有可能从每个State对象中处理。否则,它有点击败了目的?

在谷歌上搜索,试图找到设计模式一书State模式如下图:

State Behavioral Pattern

我遇到this example,这正符合我的想法更多。 所以,我正确地认为教程点示例不正确,并且State应该由状态自己更改,或者Object通过调用context.request()来保存Context

有没有像在教程点示例中那样做的有效案例?我无法亲自看到它,如果你这样做,你只会以另一个switchif声明结束。

回答

1

该示例中的代码对我来说看起来是错误的,因为作者正在从上下文之外调用状态功能。那是对的吗?

是的,你是真实的,给定的例子不佳说明了状态模式它更是一个战略这里,因为上下文对象接收适应它自身的一个新的行为来代替。

......状态应该由状态自己或通过调用context.request()来保存上下文的Object来更改?

没错。国家班级有责任设置上下文的“下一个状态”。状态机可以很容易地使用状态模式创建的:

  • 上下文是当前状态被更新的机器,它拥有一些决策信息
  • 每个状态定义了执行的动作和测试“转换”到其他根据上下文状态。如果发生转换,则上下文的状态会更新为新状态。

有没有像在Tutorials Point例子中那样做的有效案例?我不能亲自看到它,如果你这样做,你只是要结束另一个开关或声明。

我看到两个原因来更新来自外部的上下文的状态:

  • 选择的上下文的初始状态(可以通过构造被注入)
  • 中断或重置上下文中,它例如在接收ISR时在嵌入式世界中经常是这种情况。
1

是的,你是正确的上下文只能访问状态:上下文作为状态的唯一客户端。

这是在java中执行状态的example

相关问题