mvc 和 mvvm 的区别

最近身边有朋友对于MVC和MVVM有点疑问。我来写下我的理解

MVC

模式的意思是分三个部分的

  • 视图(View):用户界面
  • 控制器(Controller):业务逻辑
  • 模型(Model):数据保存

各部分之间的通信方式如下

通信方式

1. View 传送指令到 Controller

2. Controller 完成业务逻辑后,要求 Model 改变状态

3. Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的。

MVVM

MVVM 模式将 Controller 改名为 ViewModel,基本上与 MVP 模式完全一致。 图如下

通信方式

唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。

MVVM模式主要分为四部分

通信方式

1. View:它专注于界面的显示和渲染,在angular中则是包含一堆声明式Directive的视图模板。

2. ViewModel:它是View和Model的粘合体,负责View和Model的交互和协作,它负责给View提供显示的数据,以及提供了View中Command事件操作Model的途径;在angular中$scope对象充当了这个ViewModel的角色;

3. Model:它是与应用程序的业务逻辑相关的数据的封装载体,它是业务领域的对象,Model并不关心会被如何显示或操作,所以模型也不会包含任何界面显示相关的逻辑。在web页面中,大部分Model都是来自Ajax的服务端返回数据或者是全局的配置对象;而angular中的service则是封装和处理这些与Model相关的业务逻辑的场所,这类的业务服务是可以被多个Controller或者其他service复用的领域服务。

4. Controller:这并不是MVVM模式的核心元素,但它负责ViewModel对象的初始化,它将组合一个或者多个service来获取业务领域Model放在ViewModel对象上,使得应用界面在启动加载的时候达到一种可用的状态。

View不能直接与Model交互,而是通过$scope这个ViewModel来实现与Model的交互。对于界面表单的交互,通过ngModel指令来实现View和ViewModel的同步。ngModelController包含$parsers和$formatters两个转换器管道,它们分别实现View表单输入值到Model数据类型转换和Model数据到View表单数据的格式化。对于用户界面的交互Command事件(如ngClick、ngChange等)则会转发到ViewModel对象上,通过ViewModel来实现对于Model的改变。然而对于Model的任何改变,也会反应在ViewModel之上,并且会通过$scope的“脏检查机制”($digest)来更新到View。从而实现View和Model的分离,达到对前端逻辑MVVM的分层架构。

  • MVVM 的优点

    • 低耦合:View可以独立于Model变化和修改,同一个ViewModel可以被多个View复用;并且可以做到View和Model的变化互不影响;

    • 可重用性:可以把一些视图的逻辑放在ViewModel,让多个View复用;

    • 独立开发:开发人员可以专注与业务逻辑和数据的开发(ViewModel),界面设计人员可以专注于UI(View)的设计;

    • 可测试性:清晰的View分层,使得针对表现层业务逻辑的测试更容易,更简单。

文章目录
  1. 1. 最近身边有朋友对于MVC和MVVM有点疑问。我来写下我的理解
  2. 2. MVC
    1. 2.1. 各部分之间的通信方式如下
  3. 3. MVVM
    1. 3.1. MVVM模式主要分为四部分
,