演示者,演示模型,ViewModel和Controller之间有什么区别?
-
14-10-2019 - |
题
我有一个很好的主意,这些模式中的每种模式如何工作并了解它们之间的一些较小差异,但是它们真的彼此之间有什么不同吗?
在我看来,演示者,演示模型,ViewModel和Controller本质上是相同的概念。
为什么我不能将所有这些概念归类为控制器?我觉得这可能会大大简化整个想法。
谁能清楚地描述他们的差异?
我想澄清一下,我确实了解了模式的工作原理,并在一种技术或另一种技术中实施了大多数。我真正在寻找的是某人对其中一种模式的经验,以及为什么他们不将视图模型视为控制器。
我为此给出一些声誉点,但我正在寻找一个非常好的答案。
解决方案
除了已经提到的出色读物(Fowler&Miller),还回答您关于控制器/演示者/ ...的差异的观点。 从开发人员的角度来看:
MVC中的控制器:
控制器是由于用户交互而被调用的实际组件。 (开发人员不必编写代码即可将呼叫委派给控制器。)
控制器以某种方式从视图/上下文/包/其他任何方式获取当前值,但是您不会真正说 互动 有了视图。
- 控制器决定最终将显示给用户的视图。在此,控制器也显示了应用程序导航工作流的明确概念。
MVP中的主持人:
主持人的方法是通过视图调用的方法,这是在用户交互时接收控制的实际组件。 (开发人员必须在视图中编写一些代码才能致电主持人。)
主持人以某种方式从视图中获取当前值,或者在呼叫时从视图中接收它们。主持人调用视图上的方法以设置其状态(填充它 乔什·史密斯说)。主持人调用的视图方法 可能 体内有几个小设置。
主持人不会明确显示应用程序工作流程的概念。通常被认为是返回对呼叫视图的控制。
PM中的呈现模型:
呈现模型具有通过视图调用的方法,这是在用户交互时接收控制的实际组件。 (开发人员必须在视图中编写一些代码才能调用显示模型。)
呈现模型还有更多 健谈 与演示者相比,与视图的沟通。它还包含更多的逻辑,以找出在视图中应用的所有设置的值,并实际设置视图中的设置。 (这些视图方法依次几乎没有逻辑。)
呈现模型不会明确显示应用程序工作流程的概念。通常被认为是返回对呼叫视图的控制。
MVVM中的ViewModel:
ViewModel具有通过视图的调用(&属性集)的方法,该方法是在用户交互时接收控制的实际组件。 (开发人员必须在视图中编写一些(声明性的)代码才能调用ViewModel。)
与显示模型相比,ViewModel与View没有明确的Chatty通信(即,它没有经常调用视图,框架可以做到这一点)。但是它具有许多属性,这些属性将1比1映射到视图设置。它仍然包含相同的逻辑,以找出所有这些设置的值。
ViewModel不会明确显示应用程序工作流程的概念。通常被认为是返回对呼叫视图的控制。
以某种方式复制乔什·史密斯(Josh Smith)所说的话(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx):MVVM模式是PM的一种特殊情况,它利用框架(例如WPF/SL)来编写更少的代码。
其他提示
马丁·福勒(Martin Fowler)有一个关于UI设计模式的页面,他在其中定义了该图案,然后谈论MVC,MVP和其他模式。
http://martinfowler.com/eaadev/uiarchs.html
一个 控制器 活跃于控制UI。例如,它将处理UI触发的任何事件并适当地处理它们。
一个 主持人 另一方面,更具被动性,只需通过UI显示数据,该数据处理其自己的事件等,或通过主持人将其委派给服务或命令。
一个 ViewModel 是演讲者的特定示例,该示例旨在与WPF/Silverlight绑定一起使用。
一个 演示模型 是可以通过视图直接呈现的模型,因此,例如,如果您的模型实现了用于数据绑定的InotifyPropertychange,则它们将是演示模型。
至少在.NET中,MVP用作设计模式。这通常与Windows Forms应用程序或经典ASP.NET一起使用。使用MVC和MVVC,它们通常与ASP MVC一起使用,ASP MVC使用与普通ASP.NET相当不同的架构。
我认为,MVP,MVVC,MVC和演示模型之间没有真正的概念差异。有一些详细的差异,但最后,可以继续将其视为模型视图控制器设置。额外的命名只是造成混乱,我认为最好采用术语来描述控制器时有一定程度的纬度。
仅在MVP和MVVM之间的一个重要区别是该视图在更新中层中没有积极作用的方式,并且是“愚蠢的”演员,因为视图应该用于显示,而不是行为。建议使用演示者来了解“复杂”的观点,即:
- 当您通过更改活动(“导航”)来处理点击时,主持人会更容易
- 根据数据层更新(asynch)的修改视图更改将使用ViewModel实现
参考:
https://developer.android.com/topic/libraries/architecture/lifecycle#lc-bp
https://android.jlelse.eu/why-to-choose-mvvm-over-mvp-android-archituction-33c0f2de5516