MVVM本质上是一种设计模式,但是讲到MVVM,就不得不提到MVC,还有MVP
1. MVC
首先,先了解一下MVC,其被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。主要由三部分组成:
- M:
Model模型,指业务模型,通常模型对象负责在数据库中存取数据 - V:
View视图,指用户界面,通常视图是依据模型数据创建的 - C:
Controller控制器,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
MVC设计模式的数据传递都经由Controller控制器,实现M --> V --> C的数据传递。
MVC具有以下优点:
(1)低耦合。视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。
(2)重用性高。由于已经将数据和业务规则从表示层分开,所以可以最大化的重用代码了。模型也有状态管理和数据持久性处理的功能。
(3)生命周期成本低。MVC使开发和维护用户接口的技术含量降低。
(4)部署快。用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
(5)可维护性高。分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
2. MVP
简称:MVP 全称:Model-View-Presenter;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:
Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
MVP与MVC有着一个重大的区别:
(1) 在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。
(2) 在MVC里,View是可以直接访问Model的。从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的改变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。
(3) 虽然MVC中的 View 的确“可以”访问 Model,但是我们不建议在 View 中依赖 Model,而是要求尽可能把所有业务逻辑都放在 Controller 中处理,而 View 只和 Controller 交互。
MVP优点:
(1) 模型与视图完全分离,我们可以修改视图而不影响模型
(2) 可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
(3) 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
(4) 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
3. MVVM
MVVM由MVC演变过来的数据双向传递的设计模式,主要由三部分组成:
- M:
Model数据模型,用于保存数据,处理数据业务逻辑 - V:
View视图,用于展示数据,与用户进行交互 - VM:
View Model,是视图与数据模型进行数据交流的桥梁
MVVM数据的双向传递是指:
数据可以从M --> VM --> V,
也可以V --> VM --> M
MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点
(1)低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
(2)可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
(3)独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。
(4)可测试。界面素来是比较难于测试的,测试可以针对ViewModel来写。
Vue是通过数据驱动界面更新,其数据传递(默认)是:`M --> VM --> V`
而Vue受到MVVM的启发,也实现了数据的双向传递,
通过使用v-model,我们可以实现`V --> VM --> M`
<input v-model="message" placeholder="edit me">
new Vue({
el: '...',
data: {
message: "",
}
})
v-model其原理通过v-bind绑定表单元素input的value属性和通过v-on监听其input事件来改变data的值,实现了从视图到数据模型的数据传递。
参考v-model实现原理。
4. MVVM和MVC的区别
(1) 在MVC中,View可以直接访问模型,因此,View将包含Model信息,并且不可避免地包含一些业务逻辑。MVC模型侧重于模型的不变性,因此在MVC模型中,模型不依赖于视图,但视图依赖于模型。不仅如此,由于某些业务逻辑是在View中实现的,因此很难更改View,至少那些业务逻辑无法重用。
(2) MVVM是“双向绑定数据模型数据”的核心,因此View和Model之间没有连接,通过ViewModel进行交互,MVC是单向通信。也就是说,View和Model必须得到Controller的支持。MVC和MVVM之间的区别并不在于VM完全取代C。ViewModel的目的是提取Controller中显示的业务逻辑,而不是替换Controller。其他视图操作服务应在Controller中实现,换句话说,MVVM实现了业务逻辑组件的重用。
5. MVVM和MVP的区别
唯一的区别是,MVVM采用双向绑定:View的变动,自动反映在 ViewModel,反之亦然。
以上是关于MVVM的全部内容,若有不正,欢迎指出!