初学者的架构模式:MVC、MVP 和 MVVM
构建软件可能很复杂。
在构建你的副项目时你可能不需要考虑太多,但生产软件有所不同。
它可能需要多个组件,如果处理不正确,可能会导致混乱。
但它不必这么复杂。在今天的文章中,我们将深入探讨架构模式,并讨论如何将软件划分为三个简单的组件,每个组件专注于相关的任务。
架构模式
每当我们谈论软件设计中的架构模式时,首先列出的模式包括客户端-服务器、分层、单片、微内核、事件驱动等架构。这些模式关注的是整个系统架构,包括多个应用程序、服务、服务器等。
然而,MVP、MVC 和 MVVM 专注于通过分离数据、用户界面和逻辑来组织单个应用程序中的代码。它们是关注整体系统的架构模式的子集。
MVC、MVP 和 MVVM
为了保持博客的可读性并且不超过字数,我们将只关注在单个应用程序中组织代码的架构模式,即:
- 模型-视图-控制器
- 模型-视图-呈现器
- 模型-视图-视图模型
显然,这三种模型都有两个固定的组件:模型和视图。因此,在讨论每个架构之前,我们先详细讨论一下它们。
模型
该模型包含与软件中现有数据相关的所有代码。它是数据库和网络层与应用程序其余部分进行通信的层。其主要职责包括:
- 处理数据和业务逻辑。
- 封装应用程序的数据和管理访问该数据的规则。
- 处理数据结构。
- 对数据执行 CRUD(创建、读取、更新和删除)操作。
看法
视图基本上是应用程序的前端,也就是用户能够看到并与之交互的所有内容。它也被称为应用程序的用户界面 (UI)。它的职责包括:
- 处理非业务逻辑和纯粹的表现逻辑。
- 将其他层提供的数据呈现给用户。
- 接收用户输入并将其转发到其他层。
- 可能或者可以直接与模型层通信。
模型-视图-控制器(MVC)架构
现在我们已经了解了模型层和视图层的作用,让我们看一下各个架构模式。
从 MVC 开始,它使用与模型层和视图层通信的控制器层。
控制器的主要职责包括:
- 通过模型层操作数据。
- 从视图层接收指令,即 UI。
- 使用根据控制逻辑定义的更改来更新视图。
在这里,虽然视图层不能直接与模型层交互,但它可以根据数据的变化接收更新。因此,这三个层都以某种形式相互连接,而控制器是主要组件。
模型-视图-演示器(MVP)架构
在这里,Presenter 层承担了 Model 层和 View 层之间“中间人”的功能,并处理它们之间的所有通信。Model 层和 View 层之间根本不存在直接的通信。
其职责包括:
- 根据用户操作更新 UI 或视图层。
- 根据代码逻辑更新数据或者Model层。
- 处理 MVC 架构中控制器中处理的大部分业务逻辑。
模型-视图-视图模型 (MVVM) 架构
乍一看,该架构与 MVP 架构几乎相同。但它们之间有一些关键的区别:
- 多个视图可以映射到单个 ViewModel 层。
- 它在 ViewModel 层和 View 层之间使用数据绑定,使其更加事件驱动。
- 在这个架构中,没有用户界面(User Interface)的概念。视图层代表用户的操作,而不是界面。
并排比较
方面 | MVC | 最有价值球员 | MVVM |
---|---|---|---|
姓名 | 模型-视图-控制器 | 模型-视图-呈现器 | 模型-视图-视图模型 |
关注点分离 | 基本的 | 更好的 | 最好的 |
数据流 | 双向 | 单程 | 单向数据绑定 |
视图-逻辑关系 | 多对一 | 一对一 | 多对一 |
可测试性 | 难的 | 好的 | 最好的 |
维护 | 难的 | 简单的 | 简单的 |
学习曲线 | 简单的 | 简单的 | 更难 |
表现 | 由于紧密耦合,速度可能会更慢 | 松散耦合,性能更佳 | 性能流畅,尤其适用于复杂的 UI |
UI 更新 | 控制器更新视图 | 演示者更新视图 | ViewModel通过数据绑定更新View |
对 UI 框架的依赖 | 高的 | 低的 | 依赖性低或无依赖性 |
可扩展性 | 适合小规模项目 | 适用于简单和复杂的项目 | 非常适合大型、数据密集型应用程序 |
但你可能会问,哪种架构最受欢迎?所有这些架构都同样受欢迎,可以根据公司对产品的不同需求进行选择。以下公司采用了这些不同的架构:
- MVC:StackOverflow、GoDaddy、Visual Studio 网站 Dell
- MVP:谷歌(针对部分安卓应用)
- MVVM:Apple(对于一些使用 SwiftUI 的 iOS 应用)、Angular 框架、Vue.js 框架
此外,许多公司会根据每个项目或产品的具体需求混合使用这些架构。架构的选择通常取决于应用程序的复杂性、开发团队的专业知识以及项目的具体要求等因素。
结论
本文介绍了架构模式的基础知识,从如何设计整体架构到如何将单个应用程序进一步划分为三个组件以实现更好的管理和可扩展性。
- MVC 凭借其简单直接的方法,在 Web 应用程序中仍然很受欢迎。
- MVP 建立在 MVC 的基础之上,提供了更好的可测试性和更清晰的关注点分离。
- MVVM 是三者中最新的一个,在现代应用程序开发中获得了显著的关注。
它们之间没有绝对的优胜者,每种模式都有其独特的优势,适用于不同的项目和开发场景。随着软件开发格局的不断发展,我们可能会看到这些模式的进一步完善,甚至出现全新的架构。
想要了解更多所讨论的架构模式吗?以下是一些我觉得有用的参考资料:
- https://www.geeksforgeeks.org/android-architecture-patterns/
- https://www.masaischool.com/blog/comparing-software-architecture-patterns/
- https://www.apptension.com/blog-posts/mvc-vs-mvvm-vs-mvp