带着问题学习
- MVC 中三个字母分别代表什么?
- MVC 中三个代表层的关系是怎么样的?
- MVC 在 Android 中的实践应该怎么用?
- 在 Android 中,可以做到把 MVC 对应的三层都分离开吗?
- 什么情况下使用 MVC?
- 使用 MVC 有什么需要注意的地方吗?
常见的架构
- MVC
- MVP
- MVVM
- MVI
引入
最近在学习
MVC、MVP、MVVM、MVI,在网上看到光关于 MVC 就有好几种流程图。具体的,在搜索引擎一搜,大概能看到以下这几种图:
对于一个
MVC 架构模式,就有这么多种流程图,到底哪个对的,还是说都是正确的,下面来看看维基百科上对于 MVC 的流程图:
对于维基百科上对于
MVC 的关系描述图,我还是比较认可的,至于为什么对同一个架构模式 MVC,会出现这么多种版本,我的看法是:各种说法应该都是合适的 MVC 架构,只是在具体代码实现和其描述的对象上,可能存在差别,导致了其在流程图的表示上有差别,其核心仍然是 MVCMVC 简介
如果按照上面所介绍的,各种版本都是
MVC,且其核心都是符合 MVC 的设计规范的,那么到底 MVC 的核心思想应该是怎么样的呢?MVC 三个字母分别代表什么
- M:
Model,整个MVC的核心,负责数据获取及逻辑处理,并把结果 直接或间接 返回给View进行更新
- V:
View,用于显示数据和接收用户输入,并把事件传递给Controller,通常理解为应用的界面,在 Android 在通常指 xml 文件
- C:
Controller,作为控制器,处理View和Model之间的关系
MVC 的设计理论
MVC 的初衷就是把用户事件从 View 流给 Controller,而 Controller 根据 View 流过来的事件,将其分发给不同的 Model,而 Model 负责获取数据,并把数据返回给 View 进行显示MVC 的作用
经过上面的分类,把相应的代码进行拆分,可以让我们在项目中实现以下两个作用:
- 职责分离
- 代码复用
使用例子/实践
就像上面所提及的一样,
MVC 的实现有多种方案,但是其核心都是一样的,下面就来看看不同的实现何其对应的关系图或流程图是怎么样的Passive Model
- 简介
此时,
Model 只负责进行数据请求和处理,并不负责直接通知 View 进行更新,而是由 Controller 来通知 View 进行更新,并在 View 中获取 Model 的数据进行显示- 下面来看看其时序图是怎么样的

- 此时
View、Model、Controller三者的关系应该是这样的:

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

- 此时
View、Model、Controller三者的关系应该是这样的:

- 下面来看看此时的代码实现是怎么样的(以实现一个简单的加法器为例):
View层:与上面例子一样Model层:Controller层:
注意点/缺点
Activity 任务过重:从上面的例子中可以看出,虽然 MVC 是分为了三层,但是,在 Android 中具体使用的时候,Activity 承担了 Controller 的角色,而我们进行视图更新的操作,也是在 Activity 中的,也就是说,虽然 MVC 是三层,但是,我们在 Android 中,并不能真的将其当成三个独立的部分单独抽离出来实现,所以,MVC 模式会使得 Activity 同时负责了 View 更新和 Controller 分发事件的责任,如果对于复杂的情况,Activity 的代码会极速膨胀总结
MVC 模式的设计是合理的,但是在应用到 Android 实际场景中时,就有点力不从心、水土不服了,因此,具体什么时候使用 MVC 模式,还是要看具体的业务场景和需求推荐/参考
- Author:CoderWdd
- URL:https://www.wuinsights.top//article/d70ff73e7204
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts





