MVC、MVP、MVVM模式的概念与区别

MVC 框架

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

MVC 被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中

MVC框架模式图

MVC 编程模式

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

  • Model(模型)表示应用程序核心(如数据库)

  • View(视图)显示效果(HTML 页面)

  • Controller(控制器)处理输入(业务逻辑)

组成部分

MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制

Model(模型)

Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

View(视图)

View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器)

Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

优点

  • 耦合性低
  • 重用性高
  • 生命周期成本低
  • 部署快
  • 可维护性高
  • 有利软件工程化管理

缺点

  • 没有明确的定义
  • 不适合小型,中等规模的应用程序
  • 增加系统结构和实现的复杂性
  • 视图与控制器间的过于紧密的连接
  • 视图对模型数据的低效率访问
  • 一般高级的界面工具或构造器不支持模式

MVP 模式

全称:Model-View-Presenter

MVP 是从经典的模式 MVC 演变而来,它们的基本思想有相通的地方 Controller/Presenter 负责逻辑的处理,Model 提供数据,View 负责显示

MVP框架模式图

优点

  • 模型与视图完全分离,我们可以修改视图而不影响模型
  • 可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter 内部
  • 我们可以将一个 Presenter 用于多个视图,而不需要改变 Presenter 的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
  • 如果我们把逻辑放在 Presenter 中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

缺点

由于对视图的渲染放在了 Presenter 中,所以视图和 Presenter 的交互会过于频繁。还有一点需要明白,如果 Presenter 过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么 Presenter 也需要变更了。

MVVM 框架

MVVM 是 Model-View-ViewModel 的简写。它本质上就是 MVC 的改进版。

MVVM 就是将其中的 View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。

MVVM框架模式图

组成部分

模型

Model 代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑

视图

View 代表 UI 组件,它负责将数据模型转化成 UI 展现出来

视图模型

ViewModel 监听数据模型的改变和控制视图行为、处理用户交互,简单理解就是一个同步 View 和 Model 的对象,连接 Model 和 View
MVVM 没有 MVC 模式的控制器,也没有 MVP 模式的 presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。

  • 绑定器
    声明性数据和命令绑定隐含在 MVVM 模式中。在 Microsoft 解决方案堆中,绑定器是一种名为 XAML 的标记语言。绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时,声明性数据绑定技术的出现是实现该模式的一个关键因素。

优点

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

  • 低耦合
  • 可重用性
  • 独立开发
  • 可测试

区别

MVP 与 MVC 区别

作为一种新的模式,MVP 与 MVC 有着一个重大的区别:在 MVP 中 View 并不直接使用 Model,它们之间的通信是通过 Presenter (MVC 中的 Controller)来进行的,所有的交互都发生在 Presenter 内部,而在 MVC 中 View 会直接从 Model 中读取数据而不是通过 Controller。

在 MVC 里,View 是可以直接访问 Model 的!从而,View 里会包含 Model 信息,不可避免的还要包括一些业务逻辑

在 MVC 模型里,更关注的 Model 的改变,而同时有多个对 Model 的不同显示,即 View。所以,在 MVC 模型里,Model 不依赖于 View,但是 View 是依赖于 Model 的。不仅如此,因为有一些业务逻辑在 View 里实现了,导致要更改 View 也是比较困难的,至少那些业务逻辑是无法重用的。

虽然 MVC 中的 View 的确“可以”访问 Model,但是我们不建议在 View 中依赖 Model,而是要求尽可能把所有业务逻辑都放在 Controller 中处理,而 View 只和 Controller 交互

mvc mvp

MVVM 与 MVP 区别

mvvm 模式将 Presener 改名为 View Model,基本上与 MVP 模式完全一致,唯一的区别是,它采用双向绑定(data-binding) :View 的 变动,自动反映在 View Model,反之亦然。这样开发者就不用处理接收事件和 View 更新的工作,框架已经帮你做好了。