User interface 在小部件混合在一起的现代GUI系统中,如何实现MVC风格的程序设计?

User interface 在小部件混合在一起的现代GUI系统中,如何实现MVC风格的程序设计?,user-interface,model-view-controller,mobile,desktop-application,software-design,User Interface,Model View Controller,Mobile,Desktop Application,Software Design,我想知道这件事。我现在已经有一段时间感兴趣和玩弄了——尽管我承认我也有点沮丧,因为这里一些看起来最有知识的帖子很难理解,因为它们涉及很多我当时不熟悉的额外术语,即: 在描述它时,虽然这可能更多地是由于我的编码背景,因为我更多的是在桌面和移动领域,而不是在互联网/网络领域(但如果有一篇类似的信息性文章“翻译”,那就更好了)在这种情况下,甚至更好的是,在解释“域对象”等所有概念时,这只是更具概念性和更详细的内容。因为MVC是一种非常广泛适用的模式)“模型-视图-控制器”或MVC,是一种软件布局模式

我想知道这件事。我现在已经有一段时间感兴趣和玩弄了——尽管我承认我也有点沮丧,因为这里一些看起来最有知识的帖子很难理解,因为它们涉及很多我当时不熟悉的额外术语,即:

在描述它时,虽然这可能更多地是由于我的编码背景,因为我更多的是在桌面和移动领域,而不是在互联网/网络领域(但如果有一篇类似的信息性文章“翻译”,那就更好了)在这种情况下,甚至更好的是,在解释“域对象”等所有概念时,这只是更具概念性和更详细的内容。因为MVC是一种非常广泛适用的模式)“模型-视图-控制器”或MVC,是一种软件布局模式,我现在以以下方式理解:

  • 该软件由三个“层”组成。最高级别的层是模型层或“业务逻辑”层。这就是制作程序应该制作的东西的所有“螺母和齿轮”发生的地方(例如,就像在电脑游戏中,这是所有游戏逻辑发生的地方)。另外两层是数据层和UI层;实际上,它们负责将模型层转换为系统输出,分别转换为永久存储器和计算机的用户界面外围设备(如屏幕、键盘/鼠标/触摸板等)
  • 模型层分为四层:域对象,其中包含实际的业务逻辑;数据映射器,抽象对持久性存储的访问(可以是数据库,如Android的Room持久性库[SQL wrapper],或者,比如桌面/服务器空间中的文件系统),存储库包含数据映射器,并提供类似“库”的界面,您可以在其中通过键(例如“findSomething()”方法)查找和获取域对象,而服务是模型层与UI和数据层之间的接口
  • UI层分为视图和控制器组件,其中视图组件负责向用户呈现模型层数据,控制器组件负责模型层数据;也就是说,它们向模型层中具有副作用的服务发送命令。正是由于这个原因,以及模型层的存在,才产生了整个模式的名称
我的问题涉及到与现代GUI系统相关的模式的最后一部分——包括移动和桌面,例如Android(因为没有钱,我对苹果没有任何经验)。特别是,在我看来,实现这一点的逻辑方法(如果我没有弄错这一部分——正如我所说,这些帖子往往很难理解,因为它们不仅涉及所有这些专业术语,而且我试图在网上为它们寻找的解释也同样不透明)建议视图应与负责显示模型状态的GUI小部件相关联,而控制器应与用户将与之交互以使事情发生的那些小部件相关联(在大多数情况下,这意味着必须在模型层中发生某些事情)

然而,问题在于,在现代GUI系统中,似乎很难安排,因为它们将这些东西混合在了一起——其中一个更令人震惊的例子是,文档编辑器的主部件,它将编辑和显示职责融合到GUI的单个元素中,因此,它必须同时更改和显示模型层中保存的文档。此外,显示哪些控制器小部件又取决于模型层的状态,因为某些功能可能在某些状态下可用,也可能在某些状态下不可用,我们可能希望UI反映这一点,这类似于视图(表示)功能。(根据给定的功能是否可访问或在给定的模型状态下是否有意义,思考按钮是否变灰。)

如果您使用的是一个预先制作的小部件系统,几乎所有GUI系统都提供了这种系统,那么当视图(访问)和控制器(变异)呈现给您这样一个融合的界面时,有什么最佳实践可以让视图(访问)和控制器(变异)所强调的关注点尽可能分开?最后,像保存这些经常混合的小部件的窗口这样的东西的创建究竟去了哪里?这是在视图、控制器还是UI系统的某个其他部分中,不属于类别的MVC模式

或者,鉴于我之前提到的发现现有材料相当难以理解的问题,我在这里遗漏了更多的东西吗


(我还要补充一点,如果有的话,它似乎更容易适应相关的MVVM模式[模型视图模型]对于现代GUI系统来说,因为它们不会将访问/变异分离;但组织模式的选择似乎也不应该取决于您打算针对的特定UI框架,因为这样做有违目的。事实上,Android似乎非常暗示,它“想要”一个MVVM模式,因为它在中提供了一种称为ViewModel的东西除了它的片段和活动(MVVM的视图)之外,MVVM的视图不受加入元素和变异元素相同分离的约束。然而,对我来说,访问/变异分离似乎是合乎逻辑的,我想问的是如何在这些系统中实现它。)

在模型视图控制器中我认为(MVC)模式,控制器是关于处理事件(如用户输入或网络)以及(如有必要)更改模型的,如以下架构模式图所示:

以下是关于Android中MVC模式的原始文章,也是基于观点的:


在我看来,在模型-视图-控制器(MVC)模式中,C