235

如果我们使用短语“MVC、MVP 和 MVVM 设计模式之间的差异”搜索 Google,那么我们可能会得到一些 URL,它们在理论上讨论了 MVC MVP 和 MVVM 设计模式之间的差异,例如

MVP

在无法通过“dataContext”绑定的情况下使用。Windows 窗体就是一个很好的例子。为了将视图与模型分开,需要一个演示者。由于视图不能直接绑定到演示者,因此必须通过接口(IView)将信息传递给视图。

MVVM

在可以通过“dataContext”进行绑定的情况下使用。为什么?删除了每个视图的各种 IView 接口,这意味着需要维护的代码更少。MVVM 可以使用 Knockout 包含 WPF 和 javascript 项目的一些示例。

MVC

在视图和程序其余部分之间的连接并不总是可用的情况下使用(并且您不能有效地使用 MVVM 或 MVP)。这清楚地描述了 Web API 与发送到客户端浏览器的数据分离的情况。Microsoft 的 ASP.NET MVC 是管理此类情况的绝佳工具,并提供了非常清晰的 MVC 框架


但是我还没有找到一篇文章从理论上讨论差异以及示例代码。

如果我能得到一篇文章来讨论这 3 种设计模式(MVC、MVP 和 MVVM)之间的区别以及代码,那就太好了。

我想获得由这三种设计模式(MVC、MVP 和 MVVM)实现的 3 个类似CRUD应用程序的源代码。这样我就可以通过代码了解如何为这三种设计模式(MVC、MVP 和 MVVM)编写代码。

因此,如果有任何这样的文章讨论了这 3 种设计模式(MVC、MVP 和 MVVM)的代码看起来有何不同,那么请将我重定向到那篇文章。

4

6 回答 6

123

Some basic differences can be written in short:

MVC:

Traditional MVC is where there is a

  1. Model: Acts as the model for data
  2. View : Deals with the view to the user which can be the UI
  3. Controller: Controls the interaction between Model and View, where view calls the controller to update model. View can call multiple controllers if needed.

MVP:

Similar to traditional MVC but Controller is replaced by Presenter. But the Presenter, unlike Controller is responsible for changing the view as well. The view usually does not call the presenter.

MVVM

The difference here is the presence of View Model. It is kind of an implementation of Observer Design Pattern, where changes in the model are represented in the view as well, by the VM. Eg: If a slider is changed, not only the model is updated but the data which may be a text, that is displayed in the view is updated as well. So there is a two-way data binding.

于 2016-04-16T20:12:13.447 回答
60

MVC、MVP、MVVM

MVC(旧的)

MVP(由于其低耦合性而更加模块化。Presenter 是 View 和 Model 之间的中介)

MVVM(您已经在 VM 和 UI 组件之间进行了双向绑定,因此它比 MVP 更自动化) 在此处输入图像描述

另一张图片: 在此处输入图像描述

于 2017-08-24T00:04:15.360 回答
44

来自链接的很好的解释:http: //geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

我们先来看看MVC

输入首先指向控制器,而不是视图。该输入可能来自与页面交互的用户,但也可能来自简单地将特定 url 输入浏览器。在任何一种情况下,它都是一个控制器,用于启动某些功能。

Controller 和 View 之间是多对一的关系。这是因为单个控制器可能会根据正在执行的操作选择不同的视图来呈现。

从控制器到视图只有一种方式箭头。这是因为视图不了解或引用控制器。

控制器确实传回了模型,因此在视图和传递给它的预期模型之间存在知识,但提供它的控制器却没有。

MVP – 模型视图展示器

现在让我们看看 MVP 模式。它看起来与 MVC 非常相似,除了一些关键区别:

输入从 View 开始,而不是 Presenter。

View 和关联的 Presenter 之间存在一对一的映射。

View 持有对 Presenter 的引用。Presenter 还对从 View 触发的事件做出反应,因此它知道与之关联的 View。

Presenter 根据它对模型执行的请求操作更新视图,但视图不知道模型。

MVVM - 模型视图视图模型

那么有了前面的 MVC 和 MVP 模式,我们来看看 MVVM 模式,看看它有什么区别:

输入从视图开始,而不是视图模型。

虽然 View 持有对 View Model 的引用,但 View Model 没有关于 View 的信息。这就是为什么它可以在各种视图和一个视图模型之间建立一对多的映射......甚至跨技术。例如,WPF 视图和 Silverlight 视图可以共享相同的视图模型。

于 2016-08-31T07:37:59.497 回答
3

最有价值球员:

优点:

Presenter 将出现在 Model 和 view 之间。Presenter 将从 Model 中获取数据,并将根据 view 的需要对数据进行操作,并将其提供给 view,而 view 只负责渲染。

缺点:

1)我们不能将presenter用于多个模块,因为一个视图类正在根据需要在presenter中修改数据。

3)Breaking Clean架构,因为数据流应该只是向外的,但这里的数据是从presenter返回到View的。

MVC:

优点:

这里我们在视图和模型之间有控制器。这里的数据请求将从控制器到视图完成,但是数据将以接口的形式发送回视图,而不是控制器。所以,这里的控制器不会因为很多而变得臃肿交易。

缺点:

数据操作应该由 View 根据需要完成,这将是 UI 线程上的额外工作,如果数据处理更多,可能会影响 UI 渲染。

MVVM:

在宣布架构组件之后,我们可以访问 ViewModel,这为我们提供了最大的优势,即它具有生命周期意识。因此,如果视图不可用,它不会通知数据。它是一个干净的架构,因为流仅处于转发模式,数据将LiveData 自动通知。所以,这是Android推荐的架构。

甚至 MVVM 也有一个缺点。由于它是一个生命周期感知的一些概念,如警报或提醒应该出现在应用程序之外。所以,在这种情况下,我们不能使用 MVVM。

于 2020-09-14T16:58:59.737 回答
2

下图来自Erwin van der Valk 写的文章:

图片解释 MVC、MVP 和 MVVM - 作者 Erwin Vandervalk

文章解释了差异并给出了一些 C# 中的代码示例

于 2019-05-10T04:52:31.510 回答
1

MVC vs MVP vs MVVM

MVC - 模型视图控制器

View(.xml, .storyboard) - Controller(Activity, Controller) - Model(Others)

View - 渲染 UI Controller 与 View 绑定

MVP - 模型视图展示器

View(.xml, .storyboard, Activity, Controller) - Presenter(plain Class) - Model(Others)

MVVM - 查看模型 ModelView

View(.xml with data, view.swift) - ModelView(ViewModel, ObservableObject) - Model(Others)

Android 数据绑定,SwiftUI

MVVM 使用data bindingortwo way data binding连接 View 和 ModelView 基于 Observation

有时在 UI 世界(iOS、Android)中,您可以找到负责导航和设置依赖项的附加对象(Router、Navigator、Coordinator)

于 2021-11-24T08:35:15.140 回答