我可以对国家行为模式做一些澄清吗?

时间:2016-02-12 14:22:14

标签: design-patterns state

我正在考虑使用 public function beforeFilter(){ parent::beforeFilter(); if($this->request->action != 'login' && !this->Session->check('User')){ $this->Flash->error(__('U probeert toegang te krijgen tot een beveiligde omgeving')); return $this->redirect(array('controller' => 'users', 'action' => 'login')); } 模式将代码中的大switch语句转换为更易于管理的块。

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

该示例中的代码对我来说是错误的,因为作者正在State之外调用State功能。那是对的吗?

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

点击谷歌搜索下面的设计模式书State模式图:

State Behavioral Pattern

我遇到了this example,这更符合我的想法。 因此,我认为Tutorials Point示例不正确,State应该由状态本身更改,或者State保持Object并调用Context {1}}?

是否有一个有效的案例,就像在Tutorials Point示例中一样?我自己也看不到,如果你这样做,你最终会得到另一个context.request()switch声明。

2 个答案:

答案 0 :(得分:1)

Yes you are correct the context only should have access to the state : the context as is the only client of the state .

Here is an example of implementation of the state in java.

答案 1 :(得分:1)

该示例中的代码对我来说是错误的,因为作者正在从Context之外调用State功能。这是正确的吗?

是的你是真的,给定的例子很难说明状态模式它更像是策略因为Context对象接收新的行为而不是自己调整它

...状态应该由状态本身改变,还是通过调用context.request()来保存Context的对象?

右。国家班级有责任设定下一个州的状态"上下文。可以使用State模式轻松创建状态机:

  • 上下文是当前状态更新的机器,它包含一些决策信息
  • 每个州定义所执行的操作并测试"过渡"根据上下文对其他州。如果发生转换,则将上下文的状态更新为新状态。

是否有一个有效的案例,就像在Tutorials Point示例中一样?我自己也看不到,如果你这样做,你最终只能使用另一个开关或if语句。

我认为有两个原因可以从外部更新上下文的状态:

  • 选择上下文的初始状态(可以由构造函数注入)
  • 中断或重置上下文,例如,在接收ISR时,嵌入式世界就是这种情况。