代码之家  ›  专栏  ›  技术社区  ›  nlaq

如何将MVC模式应用于GUI开发

  •  8
  • nlaq  · 技术社区  · 16 年前

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

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

    5 回复  |  直到 16 年前
        1
  •  6
  •   Adam Bellaire    16 年前

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

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

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

    这将使控制器依赖于模型和视图接口,视图仅依赖于数据,而模型不依赖于数据。

    上述设计思想的一些例子可以在cab和智能客户端软件工厂中找到。 Link To Smart Client . 他们使用MVP模式,但它同样可以很容易地应用到MVC模式。

        2
  •  3
  •   dcousineau    16 年前

    大多数图形用户界面框架(从mfc到swt到任何东西)都已经是基于mvc的。实际上,MVC模式最初是由smalltalk-80创建的,后来才真正用于GUI开发。

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

    记住:MVC是一个很好的模式,但不是一个一刀切的解决方案,当基于事件或函数式编程将使您的生活更容易时,不要试图将问题强制引入MVC。

        3
  •  1
  •   MrValdez    16 年前

    想象一下这个图形用户界面:

    Zergling单元以外星图标的形式呈现给用户。您可以看到它在其空闲动画中。称之为视图。

    玩家通过点击该单元和目标位置来移动该单元。如果你想的话,你可以给玩家加字幕。把这个叫做控制器。

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

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

        4
  •  1
  •   Martin Bøgelund    16 年前

    您需要记住的一点是,在MVC设置中,控制器必须知道要调用哪个视图,但视图必须不知道控制器的任何内容。

    因此,您的视图必须为控制器提供一种通用的交互方式,这样您就可以让几个不同的控制器调用同一视图(例如,一些数据的标准化图形输出作为参数提供)。

    这为您提供了灵活性:

    1. 如果您的客户希望PDF输出 您只提供HTML 输出为,你可以摆脱 编写要调用的新PDF视图 来自控制器 作为HTML视图的参数。
    2. 如果您的客户想要不同数据源的类似HTML输出(例如),您可以编写一个新的控制器,该控制器为同一个旧的HTML视图提供不同的数据集,而旧的HTML视图只提供相同的HTML报告和其他数据。

    如果你让你的视图与特定的控制器分离,并且让你知道从控制器调用哪个视图,你就可以很好的进行了。

        5
  •  0
  •   Andrew Kennan    16 年前

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

    你怎么做可能是个棘手的问题。依赖注入?风景工厂?让视图实例化它想要的控制器吗?这实际上取决于应用程序的复杂程度。

    对于一些非常快速和简单的东西,我将从让每个视图构建它的控制器开始,然后查看其他选项(如果需要的话),以使其更大。就我个人而言,我认为一个完整的依赖注入框架对于六个表单来说是多余的:]