Presenter,Presentation Model,ViewModel和Controller之间有什么区别?

时间:2011-01-02 23:04:19

标签: model-view-controller design-patterns mvvm mvp presentation-model

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

在我看来,Presenter,Presentation Model,ViewModel和Controller基本上是相同的概念。

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

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

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

我会为此提供一些声望点,但我正在寻找一个非常好的答案。

6 个答案:

答案 0 :(得分:55)

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

MVC中的控制器

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

  • Controller会以某种方式从View / context / bag /中获取当前值,但你不会真的说它与View交互

  • Controller最终决定向用户显示哪个View。在这方面,Controller也显示了应用程序导航工作流的明确概念。

MVP中的演示者

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

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

  • Presenter未明确显示应用程序工作流程的概念。它通常被认为是对调用View的返回控制。

PM中的PresentationModel

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

  • 与Presenter相比,PresentationModel与View的 chatty 通信更多。它还包含更多逻辑,以便计算要在View中应用的所有设置的值,并在View中实际设置它们。 (那些View方法轮流几乎没有逻辑。)

  • PresentationModel未明确显示应用程序工作流的概念。它通常被认为是对调用View的返回控制。

MVVM中的ViewModel

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

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

  • ViewModel未明确显示应用程序工作流的概念。它通常被认为是对调用View的返回控制。

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

答案 1 :(得分:38)

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

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

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

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

ViewModel 是Presenter的一个特定示例,专为与WPF / Silverlight绑定一起使用而设计。

演示模型是一个可以由视图直接呈现的模型,例如,如果您的模型实现INotifyPropertyChanged用于数据绑定,它们将是Presentation Models。

答案 2 :(得分:5)

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

Here是关于这三个人的非常好的文章。

编辑:

One更多文章 - 比较。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

MVP和MVVM之间的一个重要区别是,视图在更新中间层时没有主动作用,并且是“笨拙的”参与者,因为视图应该用于显示而不是行为。 对于“复杂”的视图,建议使用演示者,即:

  • 当您通过更改“活动”(“导航”)来处理点击时,使用Presenter会更容易
  • 根据数据层更新(asynch)修改视图更改将最好用ViewModel实现

参考:

https://developer.android.com/topic/libraries/architecture/lifecycle#lc-bp

https://android.jlelse.eu/why-to-choose-mvvm-over-mvp-android-architecture-33c0f2de5516 enter image description here

enter image description here