我非常清楚这些模式中的每一种是如何工作的,并且知道它们之间的一些细微差别,但它们真的是彼此之间的差异吗?
在我看来,Presenter,Presentation Model,ViewModel和Controller基本上是相同的概念。
为什么我不能将所有这些概念归类为控制器?我觉得它可能会大大简化整个想法。
任何人都可以清楚地描述他们的差异吗?
我想澄清一点,我确实理解这些模式是如何工作的,并且已经在一种技术或其他技术中实现了大部分模式。我真正想要的是有人对这些模式之一的体验,以及为什么他们不会将他们的ViewModel视为控制器。
我会为此提供一些声望点,但我正在寻找一个非常好的答案。
答案 0 :(得分:55)
除了已经提到的精彩读物(Fowler& Miller)以及从开发人员的角度回答你关于控制器/演示者/ ...... 之间差异的观点:
MVC中的控制器:
Controller是由于用户交互而被调用的实际组件。 (开发人员不必编写代码来委托对Controller的调用。)
Controller会以某种方式从View / context / bag /中获取当前值,但你不会真的说它与View交互。
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之间的一个重要区别是,视图在更新中间层时没有主动作用,并且是“笨拙的”参与者,因为视图应该用于显示而不是行为。 对于“复杂”的视图,建议使用演示者,即:
参考:
https://developer.android.com/topic/libraries/architecture/lifecycle#lc-bp
https://android.jlelse.eu/why-to-choose-mvvm-over-mvp-android-architecture-33c0f2de5516