这些图中箭头的图例是啥(MVC - MVP - MVVM)?
Posted
技术标签:
【中文标题】这些图中箭头的图例是啥(MVC - MVP - MVVM)?【英文标题】:What is the legend of the arrows in these diagrams (MVC - MVP - MVVM)?这些图中箭头的图例是什么(MVC - MVP - MVVM)? 【发布时间】:2012-04-01 06:35:22 【问题描述】:我试图了解 MVC / MVP 和 MVVM 模式之间的主要区别。我找到了这 3 个图表,但我不确定是否理解它们。你能帮我解释一下虚线和实线的图例是什么。
来自***定义的 MVC
来自 Microsoft MSDN 网站的 MVP
来自 Microsoft MSDN 网站的 MVVM
【问题讨论】:
网站是en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller msdn.microsoft.com/en-us/library/ff647543.aspx msdn.microsoft.com/en-us/library/gg430869(v=pandp.40).aspx 请注意,在 MVVM 中,Microsoft 在模型上实现了 INotifyPropertyChanged。一些 MVVM 开发人员总是忘记的东西 ;-) 【参考方案1】: 实线是直接调用。 虚线只是事件回调。MVC 和 MVP(被动视图)模式的主要区别:
在 MVC 视图中了解模型(调用 getData() 等来显示数据) 在 MVP(被动视图)中,视图不了解模型。 Presenter 将数据从模型传递到视图。更多细节在:
-
MVC vs MVP vs MVVM
Martin Fowler 的深入描述:GUI Architectures
【讨论】:
不太正确 Andrejs,在被动视图中,视图不知道模型,但在监督控制器中它知道。 不太对。在 MVP-Passive View 中,视图不知道模型。在 MVP-Supervising Controller 中,视图肯定知道模型。【参考方案2】:我认为虚线是间接引用
我对 MVC 或 MVP 不太熟悉,但在 MVVM 中,View
引用 ViewModel
,ViewModel
引用 Model
,用实线表示。
Models
可以广播消息或引发由ViewModel
拾取的事件通知,ViewModels
可以发布由View
拾取的事件,但是这些对象不应直接引用其他对象对象,所以它们是间接引用。例如,程序员知道在Model
上引发事件通知的目的是使ViewModel
可以挂钩事件并处理某些内容,但是Model
本身从不引用ViewModel
。
如果您要比较这些模式,应该注意的是,它们是非常不同的模式,只是碰巧为某些对象共享相同的命名约定。例如,MVC 中的 Model
与 MVVM 中的 Model
不同。相反,MVC 的 M+C
等于 MVVM 的 VM
,而 MVC 的 M
包含 MVVM 的 M
和 VM
的组合
【讨论】:
是的,我完全同意,虚线是间接引用,通常显示事件流。实线显示直接引用,即在 MVC 中,控制器将具有模型和视图的字段【参考方案3】:虚线是通知(例如观察者模式),实线是直接知识(即编译时间依赖性)。数据更改通知在虚线上流动。带箭头的实线表示一个组件知道另一个组件,可以直接推送数据。虚线是更松散的耦合,因为发送者正在触发一个事件,但不知道隐藏在事件侦听器接口后面的该事件的接收者的性质(如果您正在执行这些模式的事件驱动版本)。
模式的重点是通过避免意大利面条式代码来创建顺序,其中所有内容都直接与其他所有内容交互。因此,这些图表实际上只是关于应该将什么与什么解耦的提示。像任何这样的图表一样,如果没有详细的解释,它们很难理解,它们只是真正表明你应该瞄准的目标;某些框架或多或少地支持以“纯粹的方式”做事。组件如何加载和连接在一起不在这些图表的范围内。只有当用户输入数据或模型通过不同的视图组件更新时才会发生。所以实际的类可能有编译时依赖和代码来初始化似乎违反图表的对象;然而,只要它只是将事物连接在一起的“初始化”代码,它可能并不重要。
这是一个演示文稿,它试图用一些不太正式的图表来解释 MVP、MVC(或可能是 MVVMP)和 MVVM(又名 MVB),这些图表显示了什么编译成什么以及谁通过观察者模式事件侦听器通知谁。它与您的问题相关,因为它设置了有关模式旨在实现什么的上下文,这有助于解释您问题中的图表:
Design Patterns in ZK: Java MVVM as Model-View-Binder, Simon Massey
这是一篇文章,其中没有图表,但使用三种不同的 GUI 事件驱动的桌面模式(可以粗略地描述为 MVP、MVVM 和 MVC/MVVMP)执行相同的简单屏幕三次。关于 M__ 模式的一个关键混淆点是它们是重载的名字对象,几乎没有描述性或指示实际模式。这篇文章与您的问题相关,因为它遵循 Martin Fowlers 对模式的正式描述,这些模式比它们的“M__”名称更清晰、更不容易混淆:
Implementing event-driven GUI patterns using the ZK Java AJAX framework, Simon Massey
虽然该文章没有具体回答您的问题,但它确实比较了您所询问的模式的三种实现并进行了比较;因此,它可能会阐明图表旨在描述的模式正在做出的选择。当然,如果您选择不同的框架来实现这三种模式,示例代码看起来会有所不同;但希望与该文章中显示的示例相同的权衡。
【讨论】:
【参考方案4】:MVC 用于 Spring、Struts 等 java 架构中。 MVC 代表模型视图和容器。
在Web应用中使用这个策略非常好
模型-视图-控制器 (MVC) 是一种软件架构,[1] 目前被认为是一种架构模式,用于软件工程。该模式将域逻辑(用户的应用程序逻辑)与用户界面(输入和表示)隔离开来,允许独立开发、测试和维护每个(关注点分离)。
使用 MVC 模式可以分离应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑),同时在这些元素之间提供松散耦合。[2]
【讨论】:
web 框架在 web 起飞之前并不是经典意义上的 mvc。 m__ 模式是关于“富客户端系统”(例如 smalltalk、swing、vb.net 等)。最初 Struts 和 SpringMVC 被称为“model-2”,意思是“servlet to jsp”又名“前端控制器”模式。有人将servlet标记为“C”、jsp“V”和db“M”。然而 struts 实际上只是“model-2.5”(配置为 +0.5)。 “model-2.5” web 框架并不是 mvc 的一个很好的例子,你真的无法将它们的 mvc 与 mvvm 和 mvp 进行有意义的比较。使用桌面环境和事件驱动的 m__,您可以比较模式。以上是关于这些图中箭头的图例是啥(MVC - MVP - MVVM)?的主要内容,如果未能解决你的问题,请参考以下文章