【问题标题】:"Connecting" nonGUI objects to GUI objects将非 GUI 对象“连接”到 GUI 对象
【发布时间】:2009-01-12 22:43:54
【问题描述】:

我有一组与 GUI 对象具有一对一关系的非 GUI 对象。 所有事件都通过顶级窗口路由。

GUI 对象上发生的许多(不是全部)事件会导致调用关联对象上的方法。

NonGui 对象中的一些方法在调用时会更改 GUI 对象。

一个例子是某种游戏,例如带有现代 GUI 的 Rogue。 你有一个玩家在一个回合中占据的区域(称之为区域) 并且您在 GUI 上有与之关联的对象(一个按钮)。 请记住,这只是一个类比(甚至不是真正的问题),没有一个类比是完美的。

问题是,如何设计这种东西?

由于按钮类来自第三方库,我无法在其中嵌入对 nonGUI 对象的引用,尽管我可以在 nonGUI 对象中嵌入对 GUI 对象的引用。所以看起来我必须在某个地方创建一个从按钮到“区域”的地图,但我应该把它放在哪里?在顶层窗口中?在顶级模型中? IU 会衍生出某种接口类吗?

建议?

【问题讨论】:

  • 您在引号“连接”中查找的术语称为数据绑定。

标签: model-view-controller user-interface data-binding


【解决方案1】:

如果您提及您的平台和语言会有所帮助,但通常听起来您在描述Model-View-Controller

您的“GUI”对象是视图。这是您保留用户界面的所有渲染逻辑的地方。用户与视图的交互由控制器处理。

控制器是一层薄薄的事件句柄。用户交互调用控制器上的方法,然后将它们路由到模型。

您的“非 GUI”对象是模型。这是包含业务逻辑的对象,其状态最终通过单击 GUI 上的按钮来更新。

您提到对象之间的“嵌入”引用。只要您的 GUI 中的事件可以通过某种机制路由到您的控制器,这不是必需的。这种设计模式很有用,因为它将 UI 逻辑与业务逻辑分开。您可以非常轻松地“捕捉”新视图,因为视图和控制器之间的事件连接非常少。

维基百科article 有更多信息和实现示例的链接。

【讨论】:

    【解决方案2】:

    花点时间看看Falcon's Eye(尽管它是 Nethack 而不是 Rogue)。类似游戏(或一般的命令行应用程序)的皮肤流氓有很长的历史,这不是很经典的 mvc - 它已经有一个完整的 UI,相反,您可以通过直接翻译向该 UI 添加一个装饰器,或者另一个比喻(例如 gparted,gnome 分区编辑器,它允许通过直接操作构建一系列分区编辑命令)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-14
      • 2011-07-20
      • 2010-11-03
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多