Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns UI状态的处理_Design Patterns_State - Fatal编程技术网

Design patterns UI状态的处理

Design patterns UI状态的处理,design-patterns,state,Design Patterns,State,我使用MFC编写了在Windows上运行的应用程序。菜单项的启用/禁用状态取决于许多条件。例如,如果满足条件A或条件B,我必须启用菜单项,但如果A和B同时为真,则应禁用该菜单项。我们如何在代码中对此进行建模?我想我应该使用某种状态机,但是我的状态机似乎包含了太多的状态。处理这些问题的一般方法是什么?请注意,以上只是一个例子,还有更多类似的情况。此外,始终启用菜单并在用户按下时显示错误消息的选项并不存在,因为我必须禁用菜单 我只是想澄清一下,我不是在寻找如何禁用MFC中的菜单项,我在寻找的是当涉及

我使用MFC编写了在Windows上运行的应用程序。菜单项的启用/禁用状态取决于许多条件。例如,如果满足条件A或条件B,我必须启用菜单项,但如果A和B同时为真,则应禁用该菜单项。我们如何在代码中对此进行建模?我想我应该使用某种状态机,但是我的状态机似乎包含了太多的状态。处理这些问题的一般方法是什么?请注意,以上只是一个例子,还有更多类似的情况。此外,始终启用菜单并在用户按下时显示错误消息的选项并不存在,因为我必须禁用菜单


我只是想澄清一下,我不是在寻找如何禁用MFC中的菜单项,我在寻找的是当涉及许多相互依赖的状态时,决定是否启用/禁用菜单项的最佳方法。

尝试编写一个方法,
updateUstatus()
,该方法在每个UI操作后都会被调用。该方法将根据您的条件设置菜单项(以及任何其他UI组件)的启用或禁用状态


使用一个方法进行所有UI状态更新的好处在于,您可以将所有逻辑集中在一个位置,而不是多次调用if(条件a&&B)menu.setEnabled(true)

MFC有一个内置机制,用于启用和禁用菜单项,其形式为命令路由和命令UI上的
宏。有关更多详细信息,请参阅和MSDN中的类文档

你不一定需要一个状态机。对于每个菜单命令,确定应在何处处理该命令,例如在文档、视图或主框架类中,然后实现一个
OnUpdate
处理程序,并为相应类添加一个
ON\u UPDATE\u command\u UI
消息映射条目

举个例子,看看我给你的答案。

看看答案。它被设计用来跟踪这样的东西

来自gof:

在需要时使用中介模式

一组对象以定义良好但复杂的方式进行通信。由此产生的相互依赖关系是非结构化的,难以理解

重用对象是困难的,因为它引用了许多其他对象并与之通信


分布在多个类之间的行为应该是可定制的,无需太多子类化。

但是,缺点是存在使用大型业务逻辑方法的风险:(我知道,我也想到了。但因为它在UI端,所以它不是真正的业务逻辑。如果其中有业务逻辑决策,那么应该调用其他类(例如,在某些业务逻辑类中调用“isOptionValid()”)是的。不管怎样,最好将此代码放在一个地方,而不是分散在整个应用程序中(对于此特定场景)我曾经用我的一个项目这样做过,但我不喜欢。在每个GUI操作之后调用这个函数是非常混乱的,某些GUI操作不需要调用它。总的来说,即使对我来说,遵循逻辑也是非常混乱的。我想state方法最终会添加很多类,但可能仍然是更好的方法.ON_UPDATE_COMMAND_UI仅针对相对简单的菜单和工具栏进行处理。主要问题是如何启用/禁用ON_UPDATE_COMMAND_UI无法处理的对话框上的控件。