2009-01-12 80 views
1

我有一组非GUI对象,它们与GUI对象具有一对一的关系。 所有事件都通过顶层窗口进行路由。将非GUI对象连接到GUI对象

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

NonGui对象中的某些方法在调用GUI对象时被调用。

一个例子就是像现代图形用户界面的Rogue游戏。 您有一个玩家在一个回合中占据的区域(称之为区域) ,并且您在GUI上拥有与其关联的对象(一个按钮)。 请记住它只是一个比喻(甚至不是真正的问题),没有比喻是完美的。

问题是,人们是如何设计这种事情的?

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

对此提出建议?

+0

您在引用“连接”中查找的术语被称为数据绑定。 – 2009-01-12 22:46:15

回答

3

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

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

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

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

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

维基百科article有更多信息和链接到实施例子。

0

浪费一点时间看Falcon's Eye(虽然它是Nethack而不是Rogue)。游戏有着悠久的皮肤游戏历史(或者一般的命令行应用程序),它不是非常经典的mvc - 它已经有了完整的UI,而是通过直接翻译向该UI添加装饰器,或者另一个隐喻(如gparted,gnome分区编辑器,它允许通过直接操作构建一系列分区编辑命令)