三种模式简单定义
- 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上,用户看到的视图层产生相应的变化。
-
MVP
- 在MVP模式中,Controller改名为Presenter,同时通信的方式也发生了改变:
- View接受用户指令,传递给Presenter
- Presenter根据指令对Model进行更改
- Presenter将更改的数据反馈到View上
- View跟Model不直接通信,一切交互都在Presenter中完成
-
MVVM
- 在MVVM模式中,将 Presenter 改名为 ViewModel,通信方式又有所不同:
- View和Presenter双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之ViewModel的变动也会在View中有所反映。
- 其他与MVP模式一致
-
三者的区别总结
三者的差异在于如何粘合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 变得复杂和难用了。但是,这个缺点同时也被很多人认为是优点。
-
优点: