初学者的架构模式:MVC、MVP 和 MVVM

构建软件可能很复杂。

在构建你的副项目时你可能不需要考虑太多,但生产软件有所不同。

它可能需要多个组件,如果处理不正确,所有组件都可能导致混乱。

但它并不需要这么复杂。在今天的文章中,我们将深入研究架构模式的世界,并讨论如何将软件划分为 3 个简单组件,每个组件都专注于相关任务。

架构模式

每当我们谈论软件设计中的架构模式时,首先列出的模式包括客户端-服务器、分层、单片、微内核、事件驱动等架构。这些模式涉及整个系统架构,包括多个应用程序、服务、服务器等。

然而,MVP、MVC 和 MVVM 专注于通过分离数据、用户界面和逻辑来组织单个应用程序中的代码。这些是专注于整个系统的架构模式的子集。

Client-Server Architecture vs MVC

MVC、MVP 和 MVVM

为了保持博客的可读性并且不超过字数,我们将仅关注在单个应用程序中组织代码的架构模式,即:

  • 模型-视图-控制器
  • 模型视图呈现器
  • 模型-视图-视图模型
  • 显然,这三种模型都有两个固定的组件,即模型和视图。因此,在讨论每种架构之前,我们先详细讨论一下它们。

    模型

    该模型由与软件中存在的**数据**相关的所有代码组成。它是数据库和网络层与应用程序其余部分进行通信的层。其主要职责包括:

  • 处理数据和业务逻辑。
  • 封装应用程序的数据和管理对该数据的访问的规则。
  • 处理数据结构。
  • 对数据执行 CRUD(创建、读取、更新和删除)操作。
  • Functioning of Model layer

    看法

    视图基本上是应用程序的前端,或者用户能够看到并与之交互的所有内容。它也被称为应用程序的用户界面 (UI)。其职责包括:

  • 处理非业务逻辑和纯粹的表现逻辑。
  • 将其他层提供的数据呈现给用户。
  • 接收用户输入并将其转发至其他层。
  • 可能或者可以直接与模型层通信。
  • 模型-视图-控制器 (MVC) 架构

    Model-View-Controller Architecture

    现在我们已经了解了模型层和视图层的作用,让我们看一下单独的架构模式。

    从 MVC 开始,它使用与模型层和视图层通信的 **控制器** 层。

    控制器的主要职责包括:

  • 通过模型层操作数据。
  • 从视图层接收指令,即 UI。
  • 使用由于控制逻辑而定义的改变来更新视图。
  • 这里,虽然视图层不能直接与模型层交互,但它可以根据数据的变化接收更新。因此,所有三层都以某种形式相互连接,而控制器是主要组件。

    模型-视图-演示器 (MVP) 架构

    Model-View-Presenter Architecture

    在这里,Presenter 层承担了 Model 层和 View 层之间“中间人”的功能,并处理它们之间的所有通信。Model 层和 View 层之间根本不直接进行通信。

    其职责包括:

  • 根据用户操作更新 UI 或视图层。
  • 根据代码逻辑更新数据或模型层。
  • 处理 MVC 架构中控制器中处理的大部分业务逻辑。
  • 模型-视图-视图模型 (MVVM) 架构

    Model-View-ViewModel Architecture

    乍一看,该架构与 MVP 架构几乎相同。但它们之间有一些关键区别:

  • 多个视图可以映射到单个 ViewModel 层。
  • 它在 ViewModel 层和 View 层之间使用数据绑定,使其更加事件驱动。
  • 在这个架构中没有用户界面(User Interface)的概念。视图层代表用户的操作,而不是界面。
  • 并排比较

    但你可能会问,哪种架构最受欢迎?它们都是同样受欢迎的架构,可根据公司对产品的各自要求使用。采用这些不同架构的一些公司包括:

  • MVC:StackOverflow、GoDaddy、Visual Studio 网站 Dell
  • MVP:谷歌(针对部分 Android 应用)
  • 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