与MVC相比,MVP有哪些改进?


49

我已经阅读了三天的有关Model-View-Controller(MVC)Model-View-Presenter(MVP)模式的信息。有一个问题令我非常困扰。当已经有MVC时,为什么软件设计者会发明MVP?

他们遇到了什么问题,MVC无法解决(或解决得很差),但是MVP可以解决?MVP打算解决哪些问题?

我已经阅读了很多有关MVP的历史和解释,或者关于MVC和MVP之间差异的文章,但是没有一个对我的问题有明确的答案。

在我读过的一篇文章中,有人说:

现在进入Model View Presenter,这是对MVC模式应用于现代基于组件的图形用户界面时的不足之处的回应。在现代GUI系统中,GUI组件本身而不是某些中央控制器来处理诸如鼠标移动和点击之类的用户输入。

因此,我听不懂,但实际上可以以另一种方式使用,例如GUI组件不能自行处理用户输入吗?“单独处理”到底是什么意思?



4
我认为这只是“皇帝的新装”,这是来自Mickeysoft的新流行语。
qwerty_so 2016年

4
维克多(Victor),除了“为什么会有两种不同的模式?”之外,您还有一个特定的问题吗?有两种不同的模式,因为它们以两种略有不同的方式解决相同的问题。如果有帮助,则两种模式的“模型”和“视图”本质上是相同的。关注控制器和演示者之间的差异。:你可以在这里找到更多的帮助linkedin.com/pulse/...
罗伯特·哈维

18
“我已经阅读了三天的有关MVC和MVP模式的信息。” kes。我建议您去放松身心的热水澡,或在充满鸭子的池塘或其他地方跳过一些石头。在没有任何实际应用的情况下,这种阅读会真正融化您的大脑!
user1172763 '16

11
获得所需答案的方式是通过使用这些模式构建某些内容。然后,您将得到启发。
罗伯特·哈维

Answers:


63

MVC在概念上很优雅:

  • 用户输入由控制器处理
  • 控制器更新模型
  • 模型更新视图/用户界面
           +---+
      +----| V |<----+
user  |    +---+     | updates
input |              |
      v              |
    +---+          +---+
    | C |--------->| M |
    +---+ updates  +---+

但是:MVC中的数据和事件流是循环的。而且视图通常包含重要的逻辑(例如用户操作的事件处理程序)。这些特性加在一起使系统难以测试且难以维护。

MVP体系结构用演示者代替了控制器,该演示者在视图和模型之间进行中介。这使系统线性化:

       user input         updates
+---+ -----------> +---+ --------> +---+
| V |              | P |           | M |
+---+ <----------- +---+ <-------- +---+
        updates            updates

这具有以下优点:

  • 逻辑(如事件处理程序和用户界面状态)可以从视图移动到演示者。

  • 用户界面可以根据演示者进行单元测试,因为它描述了用户界面的状态。在单元测试中,我们将视图替换为调用演示者的测试驱动程序。

  • 由于用户界面与应用程序逻辑隔离,因此两者都可以独立开发。

但是这种方法也有一些缺点:

  • 需要更多的努力。
  • 演讲者可以轻松地转变为无法维持的“上帝阶层”。
  • 该应用程序没有一个MVP轴,而是多个轴:用户界面中每个屏幕/窗口/面板一个。这可能简化您的体系结构,也可能使它过于复杂。

7
很好的答案,但是现代的MVC通常不使用事件处理程序(如果有的话),除非用于本地表单验证,而且我认为这些事件不是MVC的一部分。 这就是为什么我们拥有MVP和MVVM。MVC本质上是服务器端。
罗伯特·哈维

@amon,谢谢您的回答,它对我说了很多话。您提到,在应用程序中使用多个轴可以简化体系结构。我在许多论文中都达到了这个想法,并且提到了将其作为发明MVP的主要原因之一,因为MVC不符合复杂的GUI要求。也就是说,MVP匹配哪些需求,以及它如何解决该需求?抱歉,很执着,但我真的很想理解它。
维克多

4
@Victor没有最佳模式,但是权衡是不同的。MVC可以满足复杂的需求。在架构方面,MVP在视图和演示者之间建立1:1关系:每个视图都有自己的演示者,每个演示者都连接到一个视图。在MVC中,存在n:m关系:一个视图可以将用户输入发送到多个不同的控制器,而一个控制器可以从多个视图接收输入。这更加灵活,但也更加混乱– MVC中没有明确的“轴”。
阿蒙

1
@Victor我在GUI方面没有太多经验,所以我可能没有提到很多。我做的最后一个GUI绝对是一团糟,因为那时我还不了解MVP –线性化的数据和控制流程将是一个巨大的改进。
阿蒙

9
@RobertHarvey我认为,按照最初的定义,网络所谓的“ MVC”从来就不是真正的“ MVC”。劫持了首字母缩写词的人应该被挑起头来,以选择一个繁重的术语并使每个人困惑。
jpmc26 2013年

6

在MVP中,演示者取代了MVC的控制器。两者之间的区别在于,演示者直接操作视图。它是为主要由事件驱动的UI框架(如Windows窗体)设计的,而没有大量支持会导致MVVM模式(如WPF)的丰富数据绑定。否则,用于管理视图状态和更新支持模型的许多逻辑将存在于视图本身中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.