User interface MVP和MVC是什么?有什么区别?

User interface MVP和MVC是什么?有什么区别?,user-interface,model-view-controller,design-patterns,terminology,mvp,mvc,adr,action-domain-responder,User Interface,Model View Controller,Design Patterns,Terminology,Mvp,Mvc,Adr,Action Domain Responder,当您超越许多工具鼓励的(拖放和配置)构建用户界面的方式时,可能会遇到三种设计模式,分别称为、和。我的问题分为三个部分: 这些模式解决了哪些问题 它们有什么相似之处 它们有何不同 这两个框架都旨在分离关注点——例如,与数据源(模型)的交互、应用程序逻辑(或将数据转换为有用信息)(控制器/演示者)和显示代码(视图)。在某些情况下,该模型还可以用于将数据源转换为更高级别的抽象。这方面的一个很好的例子是 有一个关于MVC和MVP之间差异的讨论 区别在于,在MVC应用程序中,传统上视图和控制器与模型交互,

当您超越许多工具鼓励的(拖放和配置)构建用户界面的方式时,可能会遇到三种设计模式,分别称为、和。我的问题分为三个部分:

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

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

    有一个关于MVC和MVP之间差异的讨论

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

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

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


    要了解ASP.NET MVC与MVP的区别,请查看Scott Hanselman的文章。

    我不久前在博客中引用了以下内容:

    以下是它们之间的主要区别 模式:

    MVP模式

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

    • 控制器是基于行为的,可以跨多个应用程序共享 观点
    • 可以负责确定要显示的视图
    这是我在网上能找到的最好的解释。

    • MVP=模型视图演示者
    • MVC=模型视图控制器

    • 这两种呈现模式。它们分离了模型(想想域对象)、屏幕/网页(视图)和UI的行为方式(演示者/控制器)之间的依赖关系
    • 它们在概念上非常相似,人们根据口味对演示者/控制器进行不同的初始化
    • 一篇关于差异的好文章是。最值得注意的是MVC模式具有更新视图的模型
    MVP:视图负责。 在大多数情况下,视图会创建其演示者。演示者将与模型交互,并通过界面操纵视图。视图有时会与演示者交互,通常是通过一些界面。这归结为执行;您希望视图调用演示者上的方法,还是希望视图包含演示者侦听的事件?归根结底,视图知道演示者。视图将委托给演示者

    MVC:控制器负责。
    根据某些事件/请求创建或访问控制器。然后,控制器创建适当的视图,并与模型交互以进一步配置视图。它归结为:控制器创建和管理视图;视图从属于控制器。视图不了解控制器。

    另外值得记住的是,还有不同类型的MVP。福勒将这种模式分为两种:被动视图和监控控制器

    使用被动视图时,视图通常会实现一个细粒度的界面,其属性或多或少直接映射到底层UI小部件。例如,您可能有一个具有名称和地址等属性的ICCustomerView

    您的实现可能如下所示:

    public class CustomerView : ICustomerView
    {
        public string Name
        { 
            get { return txtName.Text; }
            set { txtName.Text = value; }
        }
    }
    
    您的Presenter类将与模型对话并将其“映射”到视图。这种方法被称为“被动观点”。其好处是该视图易于测试,并且更易于在UI平台(Web、Windows/XAML等)之间移动。缺点是您无法利用数据绑定(在和等框架中,数据绑定功能非常强大)

    MVP的第二种风格是监控控制器。在这种情况下,视图可能有一个名为Customer的属性,该属性再次被数据绑定到UI小部件。您不必考虑同步和微观管理视图,并且监控控制器可以在需要时介入并提供帮助,例如使用复杂的交互逻辑

    MVP的第三种“风格”(或者有人可能会称之为单独的模式)是表示模型(或者有时称为模型-视图-模型)。与MVP相比,您将M和P“合并”为一个类。您有您的用户界面小部件数据绑定到的客户对象,但也有额外的用户界面专用字段,如“IsButtonneEnabled”或“IsReadOnly”等

    我认为我找到的关于UI架构的最好资源是Jeremy Miller在。他涵盖了MVP的所有风格,并展示了实现MVP的C代码

    我也在博客中介绍了Silverlight over at的模型-视图-模型模式。

    MVP不一定是视图负责的场景(例如,请参阅Taligent的MVP)。
    我发现不幸的是,人们仍在鼓吹这是一种模式(视图负责),而不是一种反模式,因为它与“它只是一种视图”(实用主义程序员)相矛盾。“它只是一个视图”表示向用户显示的最终视图是应用程序的次要关注点。微软的MVP模式使得视图的重复使用变得更加困难,并且可以方便地为微软的设计师提供借口,避免鼓励不良做法

    坦率地说,我认为潜在的 Action in the View -> Call to Controller -> Controller Logic -> Controller returns the View.