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

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


当前回答

在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之上的包装模式。

其他回答

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

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

我已经使用了MVP和MVC,尽管我们作为开发人员倾向于关注这两种模式的技术差异,但IMHO中MVP的要点与易于采用性比其他任何东西都更相关。

如果我所在的团队已经具备良好的web表单开发风格背景,那么引入MVP比引入MVC要容易得多。我认为MVP在这种情况下是一场快速的胜利。

我的经验告诉我,将团队从web表单转移到MVP,然后从MVP转移到MVC相对容易;从web表单迁移到MVC更加困难。

我在这里留下一个链接,指向我的一个朋友发表的关于MVP和MVC的一系列文章。

http://www.qsoft.be/post/Building-the-MVP-StoreFront-Gutthrie-style.aspx

这两个框架都旨在分离关注点-例如,与数据源(模型)的交互、应用程序逻辑(或将这些数据转换为有用信息)(控制器/演示者)和显示代码(视图)。在某些情况下,模型还可以用于将数据源转换为更高级别的抽象。MVC Storefront项目就是一个很好的例子。

这里讨论了MVC与MVP之间的区别。

所做的区别在于,在MVC应用程序中,视图和控制器传统上与模型交互,而不是彼此交互。

MVP设计让演示者访问模型并与视图交互。

尽管如此,根据这些定义,ASP.NET MVC是MVP框架,因为控制器访问模型以填充视图,这意味着没有逻辑(只显示控制器提供的变量)。

要了解ASP.NET MVC与MVP的区别,请查看Scott Hanselman的MIX演示。

以下是表示通信流程的图示



这是对这些设计模式的许多变体的过度简化,但这是我喜欢思考两者之间差异的方式。

MVC

MVP