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

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


当前回答

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



其他回答

模型视图控制器

MVC是软件应用程序架构的一种模式。它将应用程序逻辑分为三个独立的部分,促进了模块化和易于协作和重用。它还使应用程序更灵活,更易于迭代。它将应用程序分为以下组件:

处理数据和业务逻辑的模型用于处理用户界面和应用程序的控制器用于处理图形用户界面对象和演示的视图

为了更清楚一点,让我们想象一个简单的购物清单应用程序。我们只需要一份本周需要购买的每件商品的名称、数量和价格的清单。下面我们将描述如何使用MVC实现这些功能。

表示器

模型是将在视图(用户界面)中显示的数据。该视图是一个界面,它显示数据(模型)并将用户命令(事件)发送给演示者,以根据该数据进行操作。视图通常引用其演示者。演示者是“中间人”(由MVC中的控制器扮演),并同时引用视图和模型。请注意,“模型”一词具有误导性。它应该是检索或操纵模型的业务逻辑。例如:如果您有一个数据库将User存储在数据库表中,并且您的View希望显示用户列表,那么Presenter将具有对数据库业务逻辑(如DAO)的引用,Presenter将从中查询用户列表。

如果您想查看具有简单实现的示例,请检查此GitHub帖子

从数据库中查询和显示用户列表的具体工作流可以如下所示:

MVC模式和MVP模式有什么区别?

MVC模式

控制器基于行为,可以跨视图共享可以负责确定要显示的视图(前控制器模式)

MVP模式

视图与模型的耦合更加松散。演示者负责将模型绑定到视图。更容易进行单元测试,因为与视图的交互是通过接口进行的通常视图到演示者的映射是一对一。复杂视图可能有多个演示者。

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

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

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

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

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

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

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

在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中,模型直接更新视图,而不是通过控制器返回。