MVP与MVVM - 为什么?

时间:2009-11-06 07:10:15

标签: design-patterns mvvm mvp

当我使用WinForm时,我正在使用MVP。但是当我开始使用WPF或Silverlight时,我转向了MVVM。

我唯一注意到的是,由于强大的绑定,我们不需要在MVVM模式中同步View和ViewModel之间的数据。

我的问题是:

1)绑定(这有助于我们不要手动同步View和ViewModel)使用MVVM的唯一优势是什么?

2)MVVM相对于MVP还有其他优势吗?有什么区别?

3)下面的代码是MVVP模式还是MVVM或两者兼而有之?

interface IView {

  void ShowMessage(string message);

}

class View : IView {
    public void ShowMessage(string message){
              MessageBox.Show(this, message);
    }
}

class ViewModel{

private IView view;

public ViewModel(IVew view){

  this.view = view;

}

........

view.ShowMessage("This is a msg");

}

4 个答案:

答案 0 :(得分:14)

我意识到你的问题已在两年前提出过了,但我想在使用MVVM一年多之后给出我的意见。

-1 - 我不确定你在问什么,但我想你在问:绑定MVVM的唯一优势是什么?答案是不。关注点,绑定和有效测试的分离是MVVM的主要优点。有许多小的好处,但我不会进入那些。绑定绝对精彩,因为所有同步都是自动化的,这意味着您的工作量减少。此外,关注点分离意味着视图模型不依赖于视图类型,因此您可以使用相同的视图模型拥有多个视图。例如,假设您创建了一个名为ErrorDataViewModel的视图模型。此类的目的是保存将显示给用户的ErrorType类列表。 ErrorType基本上显示错误信息。 ErrorDataViewModel还有一个名为AllErrorsFixed的布尔属性,让用户知道列表中的所有错误是否都已修复。 AllErrorsFixed是一个简单的属性,它使用linq查询ErrorTypes.Fixed属性列表。如果All已修复,则AllErrorsFixed将返回true。

在Application1中,您的客户希望以类似网格的方式显示错误。您所做的只是将网格绑定到该视图模型的错误列表。在Application2中,您的客户希望以更多导航格式显示错误,他们可以按表单查看每个错误表单。然后,您只需将表单控件绑定到列表中的每个错误,并将导航设置为从一个记录移动到另一个记录。但是等等,如果我们希望App1同时使用网格和逐个表单导航,我们就可以做到。更好的是,现在您希望使用Silverlight实现Web界面来替换Application1 / Application2或作为另一种产品,您不必更改视图模型。工作已经完成。

我提到了ErrorsFixed布尔值,我们忘了在我们的应用程序中实现它。我所要做的就是进入我的视图,添加一个控件或一个列或一个属性测试器,并将它绑定到布尔属性,然后你就完成了。

关于测试,测试可以更有效,因为您可以编写测试代码来验证视图模型中的更改,而不会浪费时间运行应用程序和打开视图。这并不能解决所有测试问题,但它消除了许多耗时的步骤。

-2 - MVVM或MVP有什么优势。是。一张海报不正确地说一个视图在MVVM中可以有多个VM。实际上,一个VM可以有多个视图,因为它不依赖于视图。或者换句话说,多个视图可以使用一个VM。因此,在您调用view.ShowMessage()的示例中,这不会发生在MVVM中,因为您无法保证视图(WPF或Silverlight或测试类)具有ShowMessage方法。相反,你发射一个事件。实际上,Prism很棒,因为它有事件聚合器,因此当您触发事件时,事件聚合器会处理将事件发送到分配给事件的View。因此,每个应用程序的视图都可以处理它认为合适的事件。使用MVP,您必须为每个视图创建一个Presenter。这非常耗时。

-3 - 您的示例代码是MVP。

答案 1 :(得分:5)

示例是MVP,由此行明确定义:

view.showMessage("This is a msg");

虽然MVP和MVVM产生的代码在普通示例中可能看起来相似,但这些模式却有很大不同。如果你怀疑MVVM只是微软的MVP名称,那就不是了。

这是微软的一个鲜为人知的PM(演示模型)模式的名称 - 您可能想要阅读其描述。

答案 2 :(得分:3)

它们的主要功能在Android环境中使用。

  

MVP模式:

     
      
  • 由Model,View和Presenter图层组成;
  •   
  • 查看委托给Presenter的用户输入;两层都应该有   1比1的关系;

  •   
  • 视图和模型没有紧密耦合,以便明确分离   顾虑;

  •   
  • View通过数据绑定直接连接到Model;

  •   
  • 简单的单元测试,作为Presenter第一层的界面   快点嘲笑;

  •   
     

MVVM模式:

     

包括三个关键部分:

     
      
  • 模型(业务规则,数据访问,类),

  •   
  • 查看(用户界面),

  •   
  • ViewModel(作为视图和模型之间的代理);
  •   
  • 处理与Windows演示相关的任务的绝佳解决方案   基础系统(WPF)和Silverlight应用程序框架;
  •   
  • 提供更清晰的UI和应用程序逻辑分离;
  •   
  • 单元测试更容易,因为不依赖于View
  •   
     

功能比较

     

让我们把MVP与MVVM的要点放在一起进行比较。我们还应该强调,我们不是在倡导一种模式或模式。

     

代码度量: MVP可能会产生更多的类和Java代码。在MVVM中,有更多的Java类,但每个类的代码更少。

     

可维护性: MVP易于学习,修改,添加功能。使用MVVM添加新功能可能需要一些库的使用经验。

     在MVP中

逻辑:当Presenter处理应用流程时,View实际上是您的应用程序。在MVVM中,代码类(ViewModel)是应用程序,而View是允许用户与应用程序交互的接口。

     

数据输入:以MVP中的View开头,而不是Presenter。 MVVM中的输入以View开头,而不是ViewModel。

     

映射和引用: MVP中View和Presenter之间的一对一映射,它们之间没有引用。视图和MVVM中的ViewModel之间的一对多映射,没有参考。

     

最后的话

     

显然,架构模式正在发展。 MVVM倾向于成为一个非常整洁和令人担忧的工具。同时,MVP模式足够灵活,已经受益于各种图书馆。

     

同样清楚的是,您不必严格遵守MVP或MVVM。在大多数情况下,我们无法仅在单一模式上构建应用程序,这很好。主要的是将视图,模型和它们之间的逻辑分开。

     

何时使用MVP以及何时使用MVVM,您可能会问?建议隐藏在数据绑定中。在无法与datacontext绑定的情况下,大多数开发人员更喜欢MVP(Windows Forms就是一个很好的例子)。在>的情况下,MVVM是优选的。可以使用datacontext进行绑定,因为接口较少,维护的代码较少。

使用blog的材料。

答案 3 :(得分:0)

两者之间最重要的区别之一是,在MVP中,存在紧密耦合,即Presenter,该接口是用于保存视图引用的接口,而在MVVM中,viewmodel不保存视图的引用。

第二个区别是MVP是视图和演示者之间的一对一关系,而MVVM是一对多的关系。这意味着,我们可以使用具有多个不同视图的单个视图模型,但是在MVP中,Presenter绑定到单个视图。