我可以澄清一下 State 的行为模式吗?

Can I get some clarification on the State behavioral pattern?

我正在考虑使用 State 模式将代码中的大 switch 语句转换为更易于管理的块。

我一直在 Design Patterns book, and also looking at a tutorials point example here 上读到它。

那个例子中的代码在我看来是错误的,因为作者是从 Context 外部调用 State 功能。那是对的吗?

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

在谷歌搜索时尝试找到下面的设计模式书 State 模式图:

遇到了this example,比较符合我的思路。 所以我认为 Tutorials Point 示例不正确是否正确,State 应该由各州本身更改,或者由持有 ContextObject 调用 context.request()?

是否有像 Tutorials Point 示例中那样做的有效案例?我自己看不到,如果你那样做,你只会得到另一个 switchif 语句。

是的,你是对的,只有上下文才能访问状态:上下文是状态的唯一客户端。

这是 java 中状态的实施 example

那个例子中的代码在我看来是错误的,因为作者是从上下文外部调用状态功能。对吗?

是的,你是对的,给定的例子没有很好地说明状态模式它更像是一个策略,因为上下文对象接收一种新行为,而不是自行调整。

...并且应该由状态本身或通过调用 context.request()? 保存上下文的对象来更改状态

没错。设置上下文的 "next state" 是状态 类 的责任。可以使用状态模式轻松创建状态机:

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

是否有像 Tutorials Point 示例中那样的有效案例?我自己看不到,如果你那样做,你只会得到另一个开关或 if 语句。

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

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