ConcreteState 对象能否更改它们所在的上下文?
Can the ConcreteState objects make changes to the context in which they reside?
我可能误解了本书这一部分的引述 "Design Patterns, Elements of Reusable Object-Oriented Programming"。
A context may pass itself as an argument to the State object handling the request. This lets the State object access the context if necessary.
如果 ConcreteState 是从 Request(this);
传递的上下文,该 State 是否允许对上下文本身进行更改?
在我处理上下文的示例中,Windows Form
具有 FormStart
和 FormStop
等状态。我想进行更改,以便在状态更改时,表单中的某些按钮 disabled/grayed 消失。据我所知,可以将上下文作为参数传递给 ConcreteState 的构造函数,然后状态可以对上下文进行更改。
我正在使用的定义是:
- 上下文:定义客户感兴趣的接口
- 状态:定义用于封装与特定上下文状态相关联的行为的接口
- ConcreteState:每个子类实现与上下文状态关联的行为
STATE 模式不禁止状态对 Context
进行更改。
引用 GoF 书 STATE 章节的 示例代码 部分:
TCPState
[...] can also change the state of a TCPConnection
TCPConnection
是本例中的 Context
。
该代码显示了状态修改上下文的另一个示例:
void TCPEstablished::Transmit(TCPConnection* t, TCPOctetStream* o) {
t->processOctet(o);
}
在 TCPConnection
中传输某些内容可能会导致 TCPConnection
中的内容发生变化。
所以,当然,是的,这是允许的。
我可能误解了本书这一部分的引述 "Design Patterns, Elements of Reusable Object-Oriented Programming"。
A context may pass itself as an argument to the State object handling the request. This lets the State object access the context if necessary.
如果 ConcreteState 是从 Request(this);
传递的上下文,该 State 是否允许对上下文本身进行更改?
在我处理上下文的示例中,Windows Form
具有 FormStart
和 FormStop
等状态。我想进行更改,以便在状态更改时,表单中的某些按钮 disabled/grayed 消失。据我所知,可以将上下文作为参数传递给 ConcreteState 的构造函数,然后状态可以对上下文进行更改。
我正在使用的定义是:
- 上下文:定义客户感兴趣的接口
- 状态:定义用于封装与特定上下文状态相关联的行为的接口
- ConcreteState:每个子类实现与上下文状态关联的行为
STATE 模式不禁止状态对 Context
进行更改。
引用 GoF 书 STATE 章节的 示例代码 部分:
TCPState
[...] can also change the state of aTCPConnection
TCPConnection
是本例中的 Context
。
该代码显示了状态修改上下文的另一个示例:
void TCPEstablished::Transmit(TCPConnection* t, TCPOctetStream* o) {
t->processOctet(o);
}
在 TCPConnection
中传输某些内容可能会导致 TCPConnection
中的内容发生变化。
所以,当然,是的,这是允许的。