我正在开发一个图形程序,可以让您连接或托管服务器。它有一个输入IP的字段。现在有 2 种状态:Hosting
和 Connecting
。托管 IP 字段时应禁用。为此,我会将以下内容添加到 HostConnectChanged
事件中:
if(state == Hosting)
{
ipField.enable(false);
}
else if(state == Connecting)
{
ipField.enable(true);
}
在我看来,这是一种以简单方式处理 gui 状态的合理方式。问题是向程序添加另一种类型的状态。它可以连接/托管或断开连接。连接后,IP 字段也应被禁用。
if(state == Hosting)
{
ipField.enable(false);
}
else if(state == Connecting)
{
if(state2 == Idle)
ipField.enable(true);
}
if(state2 == Running)
{
ipField.enable(false);
}
else if(state2 == Idle)
{
if(state == Connecting)
ipField.enable(true);
}
我想您明白这是怎么回事了。更大的程序如何处理多个状态?这不应该是具有简单解决方案的 gui 编程中的一个众所周知的问题吗?
最佳答案
较大的程序总是大量使用 separation of concerns ,并尽可能将状态保持在相关对象的本地。 state design pattern 是处理此类状态相关行为的一种非常常见的方法。 .
如果你的两个州是独立的:
理想情况下,几个不同的对象类将各自使用自己的状态机。例如,表单上的某些控件可能取决于连接状态。其他一些控件可能取决于表单中的修改状态。组件的全局状态(例如表单)然后简单地从其部分状态的组合中出现(例如连接/修改,或连接/未更改)。
如果您的状态是依赖的:
然而,在您的情况下,这两个状态是相关的,因为 Running
和 Connecting
似乎不兼容。最简单的方法当然是使用复合状态机,其中有效状态是所有允许的组合。然后将状态模式与复合状态一起使用。
关于c++ - 管理gui的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49435603/