【问题标题】:What is difference between MVC, MVP & MVVM design pattern in terms of coding c#在编码 c# 方面,MVC、MVP 和 MVVM 设计模式有什么区别?
【发布时间】:2013-10-26 23:43:26
【问题描述】:

如果我们使用短语“MVC、MVP 和 MVVM 设计模式之间的差异”搜索 Google,那么我们可能会得到一些讨论 the difference between MVC MVP & MVVM design pattern theoretically like 的 URL:

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)之间的区别以及代码,那就太好了。

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

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

【问题讨论】:

标签: c# design-patterns model-view-controller mvvm mvp


【解决方案1】:

一些基本的区别可以简写:

MVC:

传统的 MVC 是有一个

  1. 模型:充当数据模型
  2. View : 处理用户的视图,可以是 UI
  3. Controller:控制Model和View的交互,view调用控制器更新model。如果需要,View 可以调用多个控制器。

MVP:

与传统的 MVC 类似,但 Controller 被 Presenter 取代。但是与控制器不同,Presenter 也负责更改视图。视图通常不会调用演示者。

MVVM

这里的区别在于视图模型的存在。它是一种观察者设计模式的实现,其中模型中的更改也由 VM 表示在视图中。 例如:如果更改了滑块,不仅模型会更新,而且视图中显示的可能是文本的数据也会更新。所以有一个双向数据绑定。

【讨论】:

  • 小细节 - 您可以选择是双向数据绑定,也可以定义一种方式绑定。
  • "view 通常不调用presenter" ?你能解释一下这句话吗?如果 ui 视图不会呼叫将要呼叫的演示者?
  • @AmirZiarati 主持人密切关注事件。如果发生事件,演示者会发挥作用并采取必要的行动。
  • 可以,只要它有对视图的引用。我弄错了,我以为您的意思是视图甚至不需要最初呼叫演示者,而至少应该呼叫一次。谢谢;)
  • @PritamBanerjee,从解释上看,MVP 和 MVVM 几乎具有相同的功能。 P 或 VM 更新 M 和 V。
【解决方案2】:

MVC、MVP、MVVM

MVC(旧的)

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

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

另一张图片:

【讨论】:

  • 请不要只是复制图像——尤其是当它们彼此不一致时。请参阅 MVC(您看不到的旧版本)浏览器在上图中与 view 对话,但在下图中与控制器对话。
  • @UddhavGautam 这有点令人困惑,因为第一张图片显示 View 作为入口点,第二张显示 Controller。
  • 在第一张图中,MVVM 和 MVP 有什么区别?在我看来,它只是 V 和 VM/P 之间的链接。在一种情况下,来回消息作为双向链接,在另一种情况下,它们表示为两个单向链接。我看不出它们之间有任何功能差异。我错过了什么?
  • 浏览器是指您和应用程序之间发生交互的用户。
  • 情节转折:实际上没有人知道发生了什么。它们实际上都是一样的。哈哈。不,但实际上,即使有这些“有用”的图像,也很难处理到底发生了什么。我认为这是问题/困惑的一部分。
【解决方案3】:

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

我们先来看看MVC

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

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

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

Controller 确实传回了 Model,因此在 View 和传入它的预期 Model 之间存在知识,但服务于它的 Controller 却没有。

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 视图可以共享相同的视图模型。

【讨论】:

  • "这是因为 View 不知道或引用控制器" 这不是真的
【解决方案4】:

MVP:

优点:

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

缺点:

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

3)Breaking Clean 架构,因为数据流应该只向外流动,但这里的数据是从演示者返回到视图。

MVC:

优点:

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

缺点:

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

MVVM:

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

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

【讨论】:

    【解决方案5】:

    下图来自 Erwin van der Valk 写的article

    article 解释了差异并给出了一些 C# 代码示例

    【讨论】:

    • 上面的图片并没有混淆,在MVC中为什么VIEW直接访问Model?别人也一样?
    • 在这些图中,箭头的含义并不清楚。箭头是指访问还是操纵?在 MVC 图中,不清楚为什么没有从模型开始的箭头
    【解决方案6】:

    MVC vs MVP vs MVVM

    MVC - 模型视图控制器

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

    视图 - 渲染 UI 控制器与视图绑定

    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 bindingtwo way data binding基于Observation连接View和ModelView

    有时在 UI 世界(iOS、Android)中你会发现额外的对象(Router、Navigator、Coordinator)负责导航和设置依赖项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-17
      • 2012-07-09
      • 2011-08-16
      • 2011-06-02
      • 2010-09-05
      • 2011-03-14
      相关资源
      最近更新 更多