三种模式简单定义

  • MVC模式(Model–View–Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
  • MVP模式(Model-View-Presenter)是由MVC模式进一步演化而来的。他们从思路上而言有想通的地方,即Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
  • MVVM模式(Model-View-ViewModel)是MVP的升级版,ViewModel和View之间的交互通过Data Binding完成,而Data Binding实现了双向的交互。
这样说可能会很抽象,我们也很难分辨出这三种模式到底有什么区别。下面给大家用图进行三个模式的分层的思路讲解。

MVC

  • MVC模式中:
    • View接受用户指令,然后传递给Controller
    • Controller根据指令对Model进行更改。
    • Model更改之后,反馈到View上,用户看到的视图层产生相应的变化。

    • 图解MVC,MVP与MVVM

MVP

  • MVP模式中,Controller改名为Presenter,同时通信的方式也发生了改变:
    • View接受用户指令,传递给Presenter
    • Presenter根据指令对Model进行更改
    • Presenter将更改的数据反馈到View
    • ViewModel不直接通信,一切交互都在Presenter中完成

    • 图解MVC,MVP与MVVM

MVVM

  • MVVM模式中,将 Presenter 改名为 ViewModel,通信方式又有所不同:
    • ViewPresenter双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之ViewModel的变动也会在View中有所反映。
    • 其他与MVP模式一致

    • 图解MVC,MVP与MVVM

三者的区别总结

三者的差异在于如何粘合View和Model,实现用户的交互操作以及变更通知

  • Controller
    Controller接收View的操作事件,根据事件不同,或者调用Model的接口进行数据操作,或者进行View的跳转,从而也意味着一个Controller可以对应多个View。Controller对View的实现不太关心,只会被动地接收,Model的数据变更不通过Controller直接通知View,通常View采用观察者模式监听Model的变化。

  • Presenter
    Presenter与Controller一样,接收View的命令,对Model进行操作;与Controller不同的是Presenter会反作用于View,Model的变更通知首先被Presenter获得,然后Presenter再去更新View。一个Presenter只对应于一个View。根据Presenter和View对逻辑代码分担的程度不同,这种模式又有两种情况:Passive View和Supervisor Controller。

  • ViewModel
    注意这里的“Model”指的是View的Model,跟MVVM中的一个Model不是一回事。所谓View的Model就是包含View的一些数据属性和操作的这么一个东东,这种模式的关键技术就是数据绑定(data binding),View的变化会直接影响ViewModel,ViewModel的变化或者内容也会直接体现在View上。这种模式实际上是框架替应用开发者做了一些工作,开发者只需要较少的代码就能实现比较复杂的交互。

三者的优缺点分析

  • MVC

    • 优点
      • 耦合性:视图层和业务层分离,当任何一个部分改变的时候,不会对别的部分有很大的影响。例如:更改视图层代码,就不用重新编译模型和控制器代码
      • 重用性和可适应性高:例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示。而这些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变
      • 生命周期成本低:MVC使开发和维护用户接口的技术含量降低
      • 部署快:使用MVC模式使开发时间得到相当大的缩减。例如,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上
      • 可维护性高:分离视图层和业务逻辑层也使得WEB应用更易于维护和修改
      • 有利软件工程化管理:由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码
    • 缺点
      • 没有明确的定义:完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试
      • 不适合小型,中等规模的应用程序:花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失
      • 增加系统结构和实现的复杂性:对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率
      • 视图与控制器间的过于紧密的连接:视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用
      • 视图对模型数据的低效率访问:依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能
      • 一般高级的界面工具或构造器不支持模式:改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,会造成MVC使用的困难
  • MVP

    • 优点
      • 模型与视图完全分离:我们可以修改视图而不影响模型
      • 可以更高效地使用模型:所有的交互都发生在一个地方——Presenter内部
      • 将一个Presenter用于多个视图:在不改变Presenter的逻辑前提之下,就能将Presenter用于多个视图。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
      • 方便测试:如果我们把逻辑放在Presenter中,那么就可以脱离用户接口来测试这些逻辑(单元测试)
    • 缺点
      • 视图与Presenter交互频繁:由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁
      • Presenter与View联系过于紧密:Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。例如:原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更
  • MVVM

    • 优点
      • 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变
      • 可重用性:你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑
      • 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码
      • 可测试:界面素来是比较难于测试的,而现在测试可以针对ViewModel来写
    • 缺点
      • 数据绑定使得 Bug 很难被调试:你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。
      • 对于过大的项目,数据绑定需要花费更多的内存:某种意义上来说,我认为就是数据绑定使得 MVVM 变得复杂和难用了。但是,这个缺点同时也被很多人认为是优点。
参考资料:

相关文章:

  • 2021-11-18
  • 2022-01-10
  • 2021-12-17
  • 2021-07-15
猜你喜欢
  • 2021-11-24
  • 2021-09-22
  • 2021-09-05
  • 2021-09-16
  • 2021-05-07
  • 2021-06-15
  • 2021-12-29
相关资源
相似解决方案