我可以澄清一下 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
应该由各州本身更改,或者由持有 Context
的 Object
调用 context.request()
?
是否有像 Tutorials Point 示例中那样做的有效案例?我自己看不到,如果你那样做,你只会得到另一个 switch
或 if
语句。
是的,你是对的,只有上下文才能访问状态:上下文是状态的唯一客户端。
这是 java 中状态的实施 example。
那个例子中的代码在我看来是错误的,因为作者是从上下文外部调用状态功能。对吗?
是的,你是对的,给定的例子没有很好地说明状态模式它更像是一个策略,因为上下文对象接收一种新行为,而不是自行调整。
...并且应该由状态本身或通过调用 context.request()? 保存上下文的对象来更改状态
没错。设置上下文的 "next state" 是状态 类 的责任。可以使用状态模式轻松创建状态机:
- 上下文是更新当前状态的机器,它包含一些决策信息
- 每个状态定义执行的动作并根据上下文测试"transitions"到其他状态。如果发生转换,上下文的状态将更新为新状态。
是否有像 Tutorials Point 示例中那样的有效案例?我自己看不到,如果你那样做,你只会得到另一个开关或 if 语句。
我看到从外部更新上下文状态的两个原因:
- 选择上下文的初始状态(可以通过构造函数注入)
- 中断或重置上下文,例如在嵌入式世界中接收 ISR 时经常发生这种情况。
我正在考虑使用 State
模式将代码中的大 switch
语句转换为更易于管理的块。
我一直在 Design Patterns book, and also looking at a tutorials point example here 上读到它。
那个例子中的代码在我看来是错误的,因为作者是从 Context
外部调用 State
功能。那是对的吗?
据我了解,上下文应该是状态的包装器,并且 State
更改最有可能从每个 State
对象中处理。否则它有点违背了目的吧?
在谷歌搜索时尝试找到下面的设计模式书 State
模式图:
遇到了this example,比较符合我的思路。
所以我认为 Tutorials Point 示例不正确是否正确,State
应该由各州本身更改,或者由持有 Context
的 Object
调用 context.request()
?
是否有像 Tutorials Point 示例中那样做的有效案例?我自己看不到,如果你那样做,你只会得到另一个 switch
或 if
语句。
是的,你是对的,只有上下文才能访问状态:上下文是状态的唯一客户端。
这是 java 中状态的实施 example。
那个例子中的代码在我看来是错误的,因为作者是从上下文外部调用状态功能。对吗?
是的,你是对的,给定的例子没有很好地说明状态模式它更像是一个策略,因为上下文对象接收一种新行为,而不是自行调整。
...并且应该由状态本身或通过调用 context.request()? 保存上下文的对象来更改状态
没错。设置上下文的 "next state" 是状态 类 的责任。可以使用状态模式轻松创建状态机:
- 上下文是更新当前状态的机器,它包含一些决策信息
- 每个状态定义执行的动作并根据上下文测试"transitions"到其他状态。如果发生转换,上下文的状态将更新为新状态。
是否有像 Tutorials Point 示例中那样的有效案例?我自己看不到,如果你那样做,你只会得到另一个开关或 if 语句。
我看到从外部更新上下文状态的两个原因:
- 选择上下文的初始状态(可以通过构造函数注入)
- 中断或重置上下文,例如在嵌入式世界中接收 ISR 时经常发生这种情况。