带着问题学习

  1. MVC 中三个字母分别代表什么?
  1. MVC 中三个代表层的关系是怎么样的?
  1. MVC 在 Android 中的实践应该怎么用?
  1. 在 Android 中,可以做到把 MVC 对应的三层都分离开吗?
  1. 什么情况下使用 MVC?
  1. 使用 MVC 有什么需要注意的地方吗?

常见的架构

  • MVC
  • MVP
  • MVVM
  • MVI

引入

最近在学习 MVCMVPMVVMMVI,在网上看到光关于 MVC 就有好几种流程图。具体的,在搜索引擎一搜,大概能看到以下这几种图:
notion image
notion image
对于一个 MVC 架构模式,就有这么多种流程图,到底哪个对的,还是说都是正确的,下面来看看维基百科上对于 MVC 的流程图:
notion image
对于维基百科上对于 MVC 的关系描述图,我还是比较认可的,至于为什么对同一个架构模式 MVC,会出现这么多种版本,我的看法是:各种说法应该都是合适的 MVC 架构,只是在具体代码实现和其描述的对象上,可能存在差别,导致了其在流程图的表示上有差别,其核心仍然是 MVC

MVC 简介

如果按照上面所介绍的,各种版本都是 MVC,且其核心都是符合 MVC 的设计规范的,那么到底 MVC 的核心思想应该是怎么样的呢?

MVC 三个字母分别代表什么

  • M:Model,整个 MVC 的核心,负责数据获取及逻辑处理,并把结果 直接或间接 返回给 View 进行更新
  • V:View,用于显示数据和接收用户输入,并把事件传递给 Controller,通常理解为应用的界面,在 Android 在通常指 xml 文件
  • C:Controller,作为控制器,处理 ViewModel 之间的关系

MVC 的设计理论

MVC 的初衷就是把用户事件从 View 流给 Controller,而 Controller 根据 View 流过来的事件,将其分发给不同的 Model,而 Model 负责获取数据,并把数据返回给 View 进行显示

MVC 的作用

经过上面的分类,把相应的代码进行拆分,可以让我们在项目中实现以下两个作用:
  • 职责分离
  • 代码复用

使用例子/实践

就像上面所提及的一样,MVC 的实现有多种方案,但是其核心都是一样的,下面就来看看不同的实现何其对应的关系图或流程图是怎么样的

Passive Model

  • 简介
此时,Model 只负责进行数据请求和处理,并不负责直接通知 View 进行更新,而是由 Controller 来通知 View 进行更新,并在 View 中获取 Model 的数据进行显示
  • 下面来看看其时序图是怎么样的
notion image
  • 此时 ViewModelController 三者的关系应该是这样的:
notion image
  • 下面来看看此时的代码实现是怎么样的(以实现一个简单的加法器为例):
    • View 层:
      • Model 层:
        • Controller 层:

        Active Model

        • 简介
        此时,Model 还是只负责进行数据请求和处理,但实现了 Publisher 接口,因此 model 层是数据变化是可监听的,所以,现在不需要在 Controller 中通知 View 层更新了,只需让 View 实现 Flow.Subscriber<> 接口即可在 View 自动监听 Model 数据的变化并进行更新了,此时 Controller 只需要持有 Model 并调用 Model 的相关方法即可了
        • 下面来看看此时的时序图:
        notion image
        • 此时 ViewModelController 三者的关系应该是这样的:
        notion image
        • 下面来看看此时的代码实现是怎么样的(以实现一个简单的加法器为例):
          • View 层:与上面例子一样
          • Model 层:
            • Controller 层:

            注意点/缺点

            Activity 任务过重:从上面的例子中可以看出,虽然 MVC 是分为了三层,但是,在 Android 中具体使用的时候,Activity 承担了 Controller 的角色,而我们进行视图更新的操作,也是在 Activity 中的,也就是说,虽然 MVC 是三层,但是,我们在 Android 中,并不能真的将其当成三个独立的部分单独抽离出来实现,所以,MVC 模式会使得 Activity 同时负责了 View 更新和 Controller 分发事件的责任,如果对于复杂的情况,Activity 的代码会极速膨胀

            总结

            MVC 模式的设计是合理的,但是在应用到 Android 实际场景中时,就有点力不从心、水土不服了,因此,具体什么时候使用 MVC 模式,还是要看具体的业务场景和需求

            推荐/参考

            Leetcode_15-三数之和Architecture MVP
            Loading...