什么是MVP和MVC,有什么区别?

当超越RAD(拖放和配置)构建用户界面的方式(许多工具鼓励您)时,您可能会遇到三种名为Model-View-Controller,Model-View-Presenter和Model-View-ViewModel的设计模式。 我的问题有三个部分:

  • 这些模式解决什么问题?
  • 他们有什么相似之处?
  • 他们有什么不同?

  • 模型 - 视图 - 演示

    MVP中 ,Presenter包含View的UI业务逻辑。 所有来自View的调用都直接发送给Presenter。 Presenter也直接从View中分离出来,并通过一个接口与它交流。 这是为了允许在单元测试中模拟View。 MVP的一个共同特征是必须进行大量的双向调度。 例如,当有人点击“保存”按钮时,事件处理程序将委托给演示者的“OnSave”方法。 保存完成后,演示者将通过其界面回调视图,以便视图可以显示保存已完成。

    MVP往往是在Web窗体中实现单独呈现的非常自然的模式。 原因是View始终由ASP.NET运行时首先创建。 你可以找到更多关于这两个变种。

    两个主要变化

    被动视图:视图尽可能愚蠢且包含几乎为零的逻辑。 Presenter是一个与视图和模型交谈的中间人。 视图和模型完全相互隔离。 模型可能引发事件,但Presenter订阅它们以更新视图。 在Passive View中,没有直接的数据绑定,而是View暴露了Presenter用来设置数据的setter属性。 所有状态都由演示者管理,而不是视图。

  • Pro:最大可测性表面; 清晰地分离视图和模型
  • Con:你正在完成所有的数据绑定,因此你需要做更多的工作(例如所有的setter属性)。
  • 监督控制器:演示者处理用户手势。 视图通过数据绑定直接绑定到模型。 在这种情况下,演示者的工作是将模型传递给视图,以便它可以绑定到视图。 演示者还将包含按下按钮,导航等手势的逻辑。

  • Pro:通过利用数据绑定来减少代码量。
  • Con:由于数据绑定,可测试表面较少,View中的封装较少,因为它直接与模型对话。
  • 模型 - 视图 - 控制器

    MVC中 ,控制器负责确定显示哪个视图以响应包括应用程序加载时的任何操作。 这与动作通过视图路由到演示者的MVP不同。 在MVC中,视图中的每个动作都与调用Controller以及一个动作相关联。 在网络中,每个动作都涉及一个URL的调用,另一端有一个响应的Controller。 一旦该控制器完成其处理,它将返回正确的视图。 该顺序在整个应用程序的整个生命周期中以这种方式继续:

        Action in the View
            -> Call to Controller
            -> Controller Logic
            -> Controller returns the View.
    

    关于MVC的另一个重要区别是View并不直接绑定到Model上。 视图简单地呈现,并且是完全无状态的。 在MVC的实现中,View通常不会在代码背后有任何逻辑。 这与MVP完全相反,因为如果View没有委托给Presenter,它将永远不会被调用。

    演示模型

    另一种模式是Presentation Model模式。 在这种模式下没有Presenter。 相反,视图直接绑定到演示模型。 演示模型是专为视图制作的模型。 这意味着这个模型可以暴露一个永远不会放在域模型上的属性,因为这会违反分离关注点。 在这种情况下,Presentation Model绑定到域模型,并可以订阅来自该模型的事件。 该视图然后订阅来自演示模型的事件并相应地进行更新。 Presentation Model可以暴露视图用于调用操作的命令。 这种方法的优点是,当PM完全封装视图的所有行为时,您可以基本上删除代码隐藏。 这种模式是WPF应用程序中非常有用的候选人,也称为Model-View-ViewModel。

    有关于演示模型的MSDN文章和WPF复合应用指南(之前的Prism)关于分离演示文稿模式的章节


    我在这篇博客上发表博文,引用托德斯奈德关于两者之间差异的优秀帖子:

    以下是这些模式之间的主要区别:

    MVP模式

  • 视图更松散地耦合到模型。 演示者负责将模型绑定到视图。
  • 更容易进行单元测试,因为与视图的交互是通过界面进行的
  • 通常查看演示者映射一对一。 复杂的观点可能有多个主持人。
  • MVC模式

  • 控制器基于行为,可以在视图中共享
  • 可以负责确定要显示哪个视图
  • 这是我能找到的最好的网络解释。


    这是对这些设计模式的许多变种的过度简化,但这就是我想要考虑两者之间差异的原因。

    MVC

    MVP

    链接地址: http://www.djcxy.com/p/791.html

    上一篇: What are MVP and MVC and what is the difference?

    下一篇: Should I use Vagrant or Docker for creating an isolated environment?