协慌网

登录 贡献 社区

什么是 MVP 和 MVC,有什么区别?

当超越RAD (拖放和配置)构建用户界面的方式时,许多工具鼓励您可能会遇到三种设计模式,称为模型 - 视图 - 控制器模型 - 视图 - 展示器模型 - 视图 - 视图模型 。我的问题有三个部分:

  1. 这些模式解决了哪些问题?
  2. 它们有什么相似之处?
  3. 他们有什么不同?

答案

模型 - 视图 - 演示

MVP 中 ,Presenter 包含 View 的 UI 业务逻辑。 View 中的所有调用都直接委托给 Presenter。 Presenter 也直接与 View 分离,并通过界面与之对话。这是为了允许在单元测试中模拟 View。 MVP 的一个常见属性是必须进行大量的双向调度。例如,当有人单击 “保存” 按钮时,事件处理程序将委托给 Presenter 的 “OnSave” 方法。保存完成后,Presenter 将通过其界面回调 View,以便 View 可以显示保存已完成。

MVP 往往是在 Web 窗体中实现单独呈现的非常自然的模式。原因是 View 总是首先由 ASP.NET 运行时创建。您可以找到有关这两种变体的更多信息

两个主要变化

被动视图:视图尽可能愚蠢,几乎没有逻辑。演示者是一个与视图和模型对话的中间人。视图和模型完全相互屏蔽。模型可能会引发事件,但 Presenter 会订阅它们以更新视图。在 Passive View 中没有直接数据绑定,而 View 公开了 Presenter 用于设置数据的 setter 属性。所有状态都在 Presenter 中管理,而不是 View。

  • Pro:最大可测性表面; 清晰分离视图和模型
  • Con:更多工作(例如所有 setter 属性),因为您自己正在进行所有数据绑定。

监督控制器:演示者处理用户手势。 View 直接通过数据绑定绑定到 Model。在这种情况下,Presenter 的工作是将 Model 传递给 View,以便它可以绑定到它。 Presenter 还将包含手势逻辑,如按下按钮,导航等。

  • Pro:通过利用数据绑定,减少了代码量。
  • Con:表面上可测试的表面较少(因为数据绑定),并且 View 中的封装较少,因为它直接与 Model 进行对话。

模型 - 视图 - 控制器

MVC 中 ,Controller 负责确定响应任何操作(包括应用程序加载时)显示哪个视图。这与 MVP 不同,其中操作通过 View 路由到 Presenter。在 MVC 中,View 中的每个操作都与对 Controller 的调用以及操作相关联。在网络中,每个动作都涉及对 URL 的调用,在 URL 的另一侧有一个 Controller 响应。控制器完成处理后,将返回正确的视图。在整个应用程序的生命周期中,序列以这种方式继续:

Action in the View
        -> Call to Controller
        -> Controller Logic
        -> Controller returns the View.

MVC 的另一个重要区别是 View 不直接绑定到 Model。视图简单地呈现,并且完全是无状态的。在 MVC 的实现中,View 通常在后面的代码中没有任何逻辑。这与 MVP 完全相反,因为如果 View 没有委托给 Presenter,它将永远不会被调用。

演示模型

要看的另一种模式是Presentation Model模式。在这种模式中没有 Presenter。相反,View 直接绑定到 Presentation Model。 Presentation Model 是专为 View 设计的模型。这意味着该模型可以公开一个永远不会放在域模型上的属性,因为它会违反关注点分离。在这种情况下,表示模型绑定到域模型,并可以订阅来自该模型的事件。 View 然后订阅来自 Presentation Model 的事件并相应地更新自身。 Presentation Model 可以公开视图用于调用操作的命令。这种方法的优点在于,您可以完全删除代码隐藏,因为 PM 完全封装了视图的所有行为。此模式非常适合在 WPF 应用程序中使用,也称为Model-View-ViewModel

一篇关于演示模型MSDN 文章和关于分离演示模式的 WPF (前 Prism) 复合应用指南中的一节

我前段时间在博客上发帖 ,引用了托德 · 斯奈德关于两者之间差异的优秀帖子

以下是模式之间的主要区别:

MVP 模式

  • 视图与模型更加松散耦合。演示者负责将模型绑定到视图。
  • 更容易进行单元测试,因为与视图的交互是通过接口进行的
  • 通常一对一地查看演示者地图。复杂视图可能有多个演示者。

MVC 模式

  • 控制器基于行为,可以跨视图共享
  • 可以负责确定要显示的视图

这是我能找到的网上最好的解释。

这是对这些设计模式的许多变体的过度简化,但这就是我喜欢考虑两者之间差异的方式。

MVC

MVC

MVP

在此处输入图像描述