当超越RAD(拖放和配置)构建用户界面的方式时,许多工具都鼓励您使用三种设计模式,即模型视图控制器、模型视图演示器和模型视图视图模型。我的问题有三个部分:

这些模式解决了什么问题?它们有什么相似之处?它们有何不同?


当前回答

简而言之,

在MVC中,View有UI部分,它调用控制器,控制器反过来调用模型&模型,然后将事件返回视图。在MVP中,视图包含UI,并调用演示者作为实现部分。演示者直接调用视图以更新UI部分。包含业务逻辑的模型由演示者调用,与视图没有任何交互。因此,演示者完成了大部分工作:)

其他回答

MVP=模型视图演示者MVC=模型视图控制器两种演示模式。它们将模型(考虑域对象)、屏幕/网页(视图)和用户界面(演示者/控制器)之间的依赖关系分开它们在概念上相当相似,人们根据口味对演示者/控制器进行不同的初始化。这里有一篇关于差异的精彩文章。最值得注意的是MVC模式具有更新视图的模型。

不久前,我在博客中引用了托德·斯奈德(Todd Snyder)关于两者区别的精彩文章:

以下是模式:MVP模式视图与模型的耦合更加松散。演示者是负责将模型绑定到视图。更容易进行单元测试,因为与视图的交互是通过的接口通常视图到演示者的映射是一对一。复杂视图可能具有多主持人。MVC模式控制器基于行为,可以在意见可以负责确定要显示的视图

这是我能在网上找到的最好的解释。

你忘了动作域响应程序(ADR)。

正如上面的一些图形所解释的,MVC中的模型和视图之间有直接的关系/链接。在控制器上执行操作,控制器将在模型上执行操作。模型中的该操作将触发视图中的反应。视图在模型状态更改时始终更新。

有些人一直忘记了,MVC是在70年代末创建的,而Web只是在80年代末/90年代初创建的。MVC最初不是为Web创建的,而是为桌面应用程序创建的,其中Controller、Model和View将共存。

因为我们使用的是仍然使用相同命名约定(模型-视图-控制器)的web框架(例如:.Laravel),所以我们倾向于认为它必须是MVC,但实际上是其他东西。

相反,请查看操作域响应程序。在ADR中,控制器获得一个动作,该动作将在模型/域中执行操作。到目前为止,情况是一样的。不同的是,它然后收集该操作的响应/数据,并将其传递给Responder(例如:.view())进行渲染。当在同一组件上请求新操作时,将再次调用Controller,并重复循环。在ADR中,模型/域和视图(Reposer的响应)之间没有任何联系。

注意:维基百科指出“然而,每个ADR动作都由单独的类或闭包表示”。这不一定是真的。多个操作可以在同一控制器中,并且模式仍然相同。

mvc adr模型视图控制器动作域响应器

MVC有很多版本,这个答案是关于Smalltalk中的原始MVC。简而言之,它是

本期演讲droidcon NYC 2017-带有架构组件的干净应用程序设计阐明了这一点

在MVP中,视图从演示者中提取数据,演示者从模型中提取数据并准备/规范化数据,而在MVC中,控制器通过在视图中推送从模型中获取数据并进行设置。

在MVP中,您可以使用一个视图来处理多种类型的演示者,也可以使用单个演示者来处理不同的多个视图。

MVP通常使用某种绑定框架,例如Microsoft WPF绑定框架或HTML5和Java的各种绑定框架。

在这些框架中,UI/HTML5/XAML知道每个UI元素显示的演示者的属性,因此当您将视图绑定到演示者时,视图会查找财产,并知道如何从中绘制数据,以及当用户在UI中更改值时如何设置这些属性。

因此,例如,如果模型是一辆汽车,那么演示者是某种汽车演示者,向视图公开汽车的财产(年份、制造商、座位等)。视图知道名为“car maker”的文本字段需要显示演示者maker属性。

然后,您可以将许多不同类型的演示者绑定到视图中,所有演示者都必须具有Maker属性-它可以是飞机、火车或其他任何类型的视图,视图都不在乎。视图从演示者(无论是哪一个)获取数据,只要它实现了一个商定的接口。

这个绑定框架,如果你去掉它,它实际上就是控制器:-)

因此,您可以将MVP视为MVC的演变。

MVC很好,但问题是它的控制器通常是每个视图。控制器A知道如何设置视图A的字段。如果现在,您希望视图A显示模型B的数据,您需要控制器A了解模型B,或者需要控制器A接收带有接口的对象,这就像MVP一样,只是没有绑定,或者您需要重写控制器B中的UI设置代码。

结论:MVP和MVC都是UI模式的解耦,但MVP通常使用一个绑定框架,该框架的底层是MVC。THUS MVP的体系结构级别高于MVC,并且是MVC之上的包装模式。