8

我是一名主要的 Web 开发人员,但我对 C++ 和 C# 有很好的理解。但是,最近我编写了一个 GUI 应用程序,并且开始迷失如何处理控制器和视图逻辑之间的关系。在 PHP 中这很容易——我可以闭着眼睛写我自己的 MVC 模式——主要是因为 PHP 是无状态的,你可以根据请求重新生成整个表单。但是在应用程序编程语言中,我很快就会迷失方向。

我的问题是:如何将控制器与视图分开?视图应该附加到来自控制器的事件 - 还是视图应该实现控制器与之交互的接口?

4

5 回答 5

6

如果我是你,我会从你的视图界面公开事件。这将允许您使控制器成为整个交互的中心。

控制器将首先加载并实例化视图,我将使用依赖注入,这样您就不会创建对视图本身的依赖,而只会在界面上创建依赖。控制器将访问模型并将数据加载到视图中。控制器将绑定到视图界面上定义的事件。然后控制器将通过事件处理将数据保存回模型。

如果您愿意,您还可以使用事件代理,这样就不需要为每个视图声明一个接口。这样您就可以通过属性绑定到事件。

这将使您的控制器依赖于模型和视图接口,视图仅依赖于数据,而模型没有依赖关系。

上述设计思想的一些例子可以在 CAB 和 Smart Client Software Factory Link To Smart Client中找到。他们使用 MVP 模式,但同样可以轻松地应用于 MVC 模式。

于 2008-10-07T07:31:05.047 回答
3

大多数 GUI 框架(从 MFC 到 SWT 再到其他)都已经基于 MVC。事实上,MVC 模式最早是由 Smalltalk-80 创建的,后来才真正用于 GUI 开发。

仔细检查并查看您选择的 GUI 工具包的标准和建议的做法。有时,在解决某个问题或使用特定工具包时,MVC 并不是一个很好的模式。

记住:MVC 是一个很好的模式,但不是万能的解决方案,当基于事件或函数式编程会让你的生活更轻松时,不要试图将问题强加到 MVC 中。

于 2008-10-10T04:10:41.483 回答
1

想象一下这个 GUI:

Zergling 单位作为外星人图标呈现给用户。您可以看到它处于空闲动画中。称之为视图。

玩家通过点击单位和目标位置来移动单位。如果需要,您可以将播放器替换为 AI。称其为控制器。

单位在战斗中时,每游戏帧都会计算单位的生命值和攻击范围。您可以更改此数据以使 Zergling 成为一个范围单位。将此称为模型。

请记住这个类比并将其扩展到您的 MVC 设计。

于 2008-10-07T07:14:59.460 回答
1

您要记住的重要一点是,在您的 MVC 设置中,Controller 必须知道要调用哪个 View,但 View 必须对 Controller 一无所知。

因此,您的 View 必须为 Controller 提供一种与之交互的通用方式,以便您可以让多个不同的 Controller 调用同一个 View(例如,作为参数提供的某些数据的标准化图形输出)。

这为您提供了灵活性:

  1. 如果您的客户想要您仅提供 HTML 输出的内容的 PDF 输出,您可以编写一个新的 PDF 视图,以便从控制器调用,其参数与 HTML 视图相同。
  2. 如果您的客户想要不同数据源的类似 HTML 输出(例如),您可以编写一个新控制器,该控制器为相同的旧 HTML 视图提供不同的数据集,从而仅提供与其他数据相同的 HTML 报告。

如果你保持你的视图与特定的控制器分离,并把关于从你的控制器调用哪个视图的知识,你就在你的路上。

于 2008-10-07T08:24:53.110 回答
0

您的控制器应该明确地绑定到视图实现的接口上定义的事件。

你如何去做这件事可能是棘手的部分。依赖注入?观景厂?视图是否实例化了它想要的控制器?这实际上取决于应用程序的复杂程度。

对于真正快速和简单的事情,我将从让每个视图构造它的控制器开始,然后如果它需要变得更大,则查看其他选项。就我个人而言,我认为一个完整的依赖注入框架对于六种形式来说太过分了:]

于 2008-10-07T08:37:22.913 回答