Model view controller &引用;“连接”;非GUI对象到GUI对象

Model view controller &引用;“连接”;非GUI对象到GUI对象,model-view-controller,user-interface,data-binding,Model View Controller,User Interface,Data Binding,我有一组非UI对象,它们与GUI对象有一对一的关系。 所有事件都通过顶级窗口发送 GUI对象上发生的许多(并非所有)事件导致调用关联对象上的方法 非UI对象中的某些方法在调用时会更改GUI对象 一个例子是一些类似于Rogue的游戏,带有现代GUI。 玩家在一个回合内占据的区域(称之为区域) 并且在GUI上有与其关联的对象(按钮)。 请记住,这只是一个类比(甚至不是真正的问题),没有一个类比是完美的 问题是,如何设计这种东西 由于button类来自第三方库,因此我无法在其中嵌入对nonGUI对象的

我有一组非UI对象,它们与GUI对象有一对一的关系。 所有事件都通过顶级窗口发送

GUI对象上发生的许多(并非所有)事件导致调用关联对象上的方法

非UI对象中的某些方法在调用时会更改GUI对象

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

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

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


建议?

如果您提到您的平台和语言,会有所帮助,但一般来说,听起来像是在描述

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

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

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

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


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

浪费一点时间看一下(尽管它是Nethack而不是Rogue)。剥皮类似rogue的游戏(或一般的命令行应用)已经有很长的历史了,这并不是很经典的mvc——它已经有了完整的UI,相反,你可以通过直接翻译或其他隐喻向该UI添加装饰器(例如gparted,gnome分区编辑器,它允许通过直接操作构建一系列分区编辑命令)

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