ConcreteState对象能否更改它们所驻留的上下文?

时间:2018-06-29 21:42:51

标签: c# winforms design-patterns state

这是我可能会从“设计模式,可重用的面向对象编程的元素”一书中误解这句话。

  

上下文可以将自身作为参数传递给处理请求的State对象。这使State对象可以在必要时访问上下文。

如果传递了ConcreteState,则Request(this);的上下文是否允许该State更改上下文本身?

在此示例中,我正在处理的上下文是Windows Form,其状态为FormStartFormStop。我想进行更改,以便在更改状态时,表单中的某些按钮被禁用/显示为灰色。据我所知,ConcreteState的构造函数可以将上下文作为参数传递,然后状态可以对上下文进行更改。

我正在使用的定义是:

  • 上下文:定义客户感兴趣的界面
  • 状态:定义用于封装与特定上下文状态相关联的行为的接口
  • ConcreteState:每个子类实现与上下文状态关联的行为

1 个答案:

答案 0 :(得分:1)

STATE 模式不禁止该状态更改Context

GoF书中 STATE 一章的示例代码部分的报价:

  

TCPState [...]也可以更改TCPConnection

的状态
在这种情况下,

TCPConnectionContext

代码显示了修改上下文的状态的另一个示例:

void TCPEstablished::Transmit(TCPConnection* t, TCPOctetStream* o) {
    t->processOctet(o);
}

TCPConnection中传输内容可能会导致TCPConnection中的更改。

所以,绝对可以。