MV* 是指各种 MVC、MVVM 等 Web 设计模式,通过分离关注点来改进代码的组织方式,设计模式并不是凭空的创造,而是对复杂问题解决的不断提炼,即使没有看过这些设计模式的介绍,也许在日常开发中就已经使用了其中的思想

MVVM

MVVM 是Model-View-ViewModel的简写。即模型-视图-视图模型。Model 指的是后端传递的数据。

View 指的是所看到的页面。ViewModel 是 mvvm 模式的核心,它是连接 view 和 model 的桥梁。

它有两个方向:

  • 一是将 model 转化成 view,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。
  • 二是将 view 转化成 model,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。
  • 这两个方向都实现的,称之为数据的双向绑定。

在 MVVM 的框架下视图和模型是不能直接通信的。它们通过 ViewModel 来通信,ViewModel 通常要实现一个 observer 观察者,当数据发生变化,ViewModel 能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel 也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且 MVVM 中的 View 和 ViewModel 可以互相通信。

MVVM 流程图:

MVVM流程图

MVVM 优点:

MVVM 模式和 MVC 模式类似,主要目的是分离视图(View)和模型(Model),有几大优点:

  • 低耦合,视图(View)可以独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的”View”上,当 View 变化的时候 Model 可以不变,当 Model 变化的时候 View 也可以不变。
  • 可重用性,可以把一些视图逻辑放在一个 ViewModel 里面,让很多 view 重用这段视图逻辑。
  • 独立开发,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用 Expression Blend 可以很容易设计界面并生成 xml 代码。
  • 可测试,界面向来是比较难于测试的,而现在测试可以针对 ViewModel 来写。

MVC

MVC 是 Model View Controller 的缩写

  • Model:模型层,数据相关的操作
  • View:视图层,用户界面渲染逻辑
  • Controller:控制器,数据模型和视图之间通信的桥梁

MVC 模型有很多变种和数据流动方式,最传统的 MVC 模型把视图渲染和数据处理做了隔离,通过控制器接收 View 操作,传递给数据模型,数据 ready 后由数据模型驱动视图渲染

MVC 特点:

MVC 模式的特点在于实现关注点分离,即应用程序中的数据模型与业务和展示逻辑解耦。在客户端 web 开发中,就是将模型(M-数据、操作数据)、视图(V-显示数据的 HTML 元素)之间实现代码分离,松散耦合,使之成为一个更容易开发、维护和测试的客户端应用程序。

  • View 传送指令到 Controller ;
  • Controller 完成业务逻辑后,要求 Model 改变状态 ;
  • Model 将新的数据发送到 View,用户得到反馈。

MVC 流程:

MVC 优点:

  • 耦合性低,视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码。
  • 重用性高
  • 生命周期成本低
  • MVC 使开发和维护用户接口的技术含量降低
  • 可维护性高,分离视图层和业务逻辑层也使得 WEB 应用更易于维护和修改
  • 部署快

MVC 缺点

  • 不适合小型,中等规模的应用程序,花费大量时间将 MVC 应用到规模并不是很大的应用程序通常会得不偿失。
  • 视图与控制器间过于紧密连接,视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
  • 视图对模型数据的低效率访问,依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。