将nonGUI对象“连接”到GUI对象

时间:2009-01-12 22:43:54

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

我有一组nonGUI对象,它们与GUI对象具有一对一的实现。 所有事件都通过顶级窗口进行路由。

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

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

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

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

由于按钮类来自第三方库,我无法在其中嵌入对nonGUI对象的引用,尽管我可以在nonGUI对象中嵌入对GUI对象的引用。所以看起来我将不得不在某个地方创建一个从按钮到“地区”的地图,但我在哪里放呢?在顶层窗口?在顶级模型? IU是否会剥离某种接口类?

建议?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

维基百科article提供了更多信息和指向实施示例的链接。

答案 1 :(得分:0)

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