57

我很清楚每种模式是如何工作的,并且知道它们之间的一些细微差别,但它们真的彼此不同吗?

在我看来,Presenter、Presentation Model、ViewModel 和 Controller 本质上是同一个概念。

为什么我不能将所有这些概念都归类为控制器?我觉得它可能会大大简化整个想法。

任何人都可以清楚地描述他们的差异吗?

我想澄清一下,我确实了解这些模式是如何工作的,并且已经在一种或另一种技术中实现了其中的大部分。我真正在寻找的是某人对这些模式之一的体验,以及为什么他们不会将他们的 ViewModel 视为控制器。

我会为此给出一些声誉积分,但我正在寻找一个非常好的答案。

4

6 回答 6

69

除了已经提到的精彩读物(Fowler & Miller),并从开发人员的角度回答您关于控制器/演示者/之间差异的观点

MVC 中的控制器

  • 控制器是由于用户交互而被调用的实际组件。(开发人员不必编写代码来将调用委托给控制器。)

  • 控制器以某种方式从 View/context/bag/whatever 中获取当前值,但您不会真正说它与 View交互。

  • 控制器最终决定将哪个视图显示给用户。在这方面,Controller 也显示了应用程序导航工作流的明确概念。

MVP 中的主持人

  • Presenter 具有被 View 调用的方法,View 是在用户交互时接收控制的实际组件。(开发人员必须在 View 中编写一些代码才能调用 Presenter。)

  • Presenter 以某种方式从 View 获取当前值,或者在调用时从 View 接收它们。Presenter 调用 View 上的方法以设置其状态(填充它说 Josh Smith)。Presenter 调用的 View 方法可能在其主体中执行了几个小设置。

  • Presenter 没有明确显示应用程序工作流的概念。它通常被认为是将控制权返回给调用视图。

PM中的PresentationModel

  • PresentationModel 具有视图调用的方法,视图是在用户交互时接收控制的实际组件。(开发人员必须在视图中编写一些代码才能调用 PresentationModel。)

  • 与 Presenter 相比,PresentationModel 与 View 的交流更加健谈。它还包含更多逻辑,以便找出要在视图中应用的所有设置的值,并在视图中实际设置这些设置。(这些 View 方法依次几乎没有逻辑。)

  • PresentationModel 没有明确显示应用程序工作流的概念。它通常被认为是将控制权返回给调用视图。

MVVM 中的视图模型

  • ViewModel 有 View 调用的方法(& 属性集),View 是在用户交互时接收控制的实际组件。(开发人员必须在 View 中编写一些(声明性)代码才能调用 ViewModel。)

  • 与PresentationModel 相比,ViewModel 与View 没有明确的交流(即它不会经常调用View,框架会这样做)。但它有很多属性可以通过视图设置将 1 映射到 1。它仍然包含相同的逻辑来计算所有这些设置的值。

  • ViewModel 没有明确显示应用程序工作流的概念。它通常被认为是将控制权返回给调用视图。

  • 以某种方式复制 Josh Smith 所说的 ( http://msdn.microsoft.com/en-us/magazine/dd419663.aspx):MVVM模式是 PM 的一种特殊情况,它按顺序利用框架(如 WPF/SL)编写更少的代码。

于 2011-02-26T00:48:47.307 回答
47

Martin Fowler 有一个关于 UI 设计模式的页面,他在其中定义并讨论了 MVC、MVP 和其他模式。

http://martinfowler.com/eaaDev/uiArchs.html

控制器在控制 UI 时处于活动状态。例如,它将处理由 UI 触发的任何事件并适当地处理它们。

另一方面,Presenter 更被动,只是通过 UI 显示数据,UI 处理它自己的事件等,或者通过 Presenter 将它们委托给服务或命令

ViewModel是 Presenter 的一个特定示例,设计用于 WPF/Silverlight 绑定。

Presentation Model是可以直接由视图呈现的模型,例如,如果您的模型为数据绑定实现 INotifyPropertyChanged,它们将是 Presentation Models。

于 2011-01-06T05:01:09.660 回答
6

在我看来,MVP、MVVC、MVC 和 Presentation Model 之间没有真正的概念差异。有一些详细的差异,但最后,它们都可以继续被认为是模型视图控制器设置。额外的命名只会造成混淆,我认为最好采用允许在描述控制器时有一定自由度的术语。

于 2011-01-06T03:34:27.150 回答
6

它们之间的区别本质上在于视图中有多少代码。它们之间的选择实际上是对应用程序技术的选择,例如 WFP、WinForms、ASP MVC(2)。将逻辑与表示分离的基本思想是相同的。

是关于这三个方面的非常好的文章。

编辑:

还有一篇文章 - 比较。

于 2011-01-02T23:28:47.290 回答
1

至少在 .Net 中,MVP 被用作一种设计模式。这通常与 Windows 窗体应用程序或经典 ASP.Net 一起使用。对于 MVC 和 MVVC,这些通常与 ASP MVC 一起使用,它使用与普通 ASP.Net 完全不同的架构。

于 2011-01-02T23:12:06.917 回答
1

MVP 和 MVVM 之间的一个重要区别是 VM 可以与许多视图一起使用,MVP 通常是 Presenter 和 View 之间的 1-1,具有强制执行其方法的合同接口。Android 在将 MVVM 与构建在保留 Fragment 之上的 ViewModel 组件结合起来方面做了很多工作。它是架构的首选模式,非常适合任何应用程序。

于 2018-12-09T21:44:50.973 回答