前言

这是架构学习系列的第三篇,主要介绍一下 MVC, MVP 以及 MVVM 架构,至于 MVI 后面会单独介绍。这些 MVX 的目的都是为了将业务和视图分离,松耦合,作为 Android 程序猿,大多不陌生了。

一个 App 离不开 Model 和 View 这两个角色, Model 决定了 App 的数据,而 View 决定怎么向用户展示这些数据,大多框架或组件基本上都是用来处理这两者之间的交互关系的。

因此一个 App 的架构需要处理两个任务:

  1. 更新 Model —— 如何处理 View action?
  2. 更新 View —— 如何将 Model 的数据表现到 View 上?

基于此,在 Android 上一般有如下三种常用架构(本期不讲 MVI):

  • MVC —— Model-View-Controller: 作为 Controller 层的 Actvity/Fragment 等充当了 View 的角色,代码过于臃肿;同时在 View 层又容易直接操作 Model,导致 View 和 Model 层耦合,无法独立复用。有时候看到一个 Activity 能有几千甚至上万行的代码,简直噩梦。
  • MVP —— Model-View-Presenter: Presenter 和 View 层之间通过定义接口实现通信,解耦了 View 和 Model 层。然而当业务场景比较复杂时,接口定义会越来越多,且可能定义模糊,接口一旦变化,对应实现也需要发生变化。
  • MVVM —— Model-View-ViewModel: MVVM 解决了 MVP 的问题,使得 ViewModel 和 View 之间不再依赖接口通信,而是通过 LiveData, RxJava, Flow 等响应式开发的方式来通信。

我们在这里可以看下 Model 和 View 的理解:

  • View: 视图,向用户呈现的界面,与用户直接交互的一层。
  • Model: Model 通常应包括数据和一些业务逻辑,即数据的结构定义,以及存储和获取等。而针对外部组件而言, Model 往往表示向其提供的数据,毕竟它们不关心数据是咋来的,咋走的,它们只关心它们自己。

MVC

该架构涉及三个角色: Model-View-Controller。其中 Controller 是 Model 与 View 之间的桥梁,用来控制程序的流程。

我记得曾经在网上看过不少 MVC 的文章,但是貌似有些文章里面给的模型图不太一样,一度有些费解,其实这些不一样的地方在于 MVC 模型经过发展存在着变体而已。一个版本的 MVC 是这样子的:

该版本一般的交互流程是:

  1. 用户操作 View, 比如说产生了一个点击事件。
  2. Controller 接收事件,对其作出反应。比如说是点击登录事件,它会校验用户输入是否为空,若为空则直接返回 View 让其提示用户;若不为空则请求 Model 层。
  3. Model 作出处理后,需要把登录用户的数据通知到相关成员,上图中即是 View 层。View 收到后作出相关展示。

在上图中 View 层依赖了 Model 层,降低了 View 的可复用性,为了解耦,出现了下图的版本:

这个版本的主要改动就是 View 和 Model 不直接通信了,View 通过 Controller 去更新 Model 层的数据,Model 层完成逻辑后通知 Controller 层,Controller 再去更新 View。

MVC 架构小结

  • MVC 为视图和业务的分离提供了开创性的思路,解耦了 View 和 Model 层,提高了复用性。
  • 然而在 Android 的实际应用中, 容易出现一个新的角色 —— ViewController, 比如说 Activity 又当 View 又当 Controller 的,十分臃肿,耦合也随之变得严重了起来,还不方便单元测试。

MVP

该架构涉及三个角色: Model-View-Presenter。关系图如下:

这张图跟上面第二个版本的 MVC 结构很像,不一样的地方在于 Controller 换成了 Presenter 层,其职责是类似的,但是实现方式不一样。MVP 之间是通过接口来通信的,三个层都有各自的接口来定义其行为与能力,这样可以降低耦合,提高复用性,也方便了单元测试。

其交互流程依旧是:用户操作 View 层,产生了一个事件; Presenter 接收事件,并对其作出反应,请求 Model 层; Model 层作出处理后通知给 Presenter, Presenter 进而再通知到 View 层。

通过登录场景举个栗子

Android架构学习之路三-MVX相关推荐

  1. android开发学习之路——连连看之加载图片(三)

    正如前面AbstractBoard类的代码中看到的,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从res\ dra ...

  2. Android SurfaceFlinger 学习之路(五)----VSync 工作原理

    原址 VSync信号的科普我们上一篇已经介绍过了,这篇我们要分析在SurfaceFlinger中的作用.(愈发觉得做笔记对自己记忆模块巩固有很多帮助,整理文章不一定是用来给别人看的,但一定是为加强自己 ...

  3. android开发学习之路——连连看之游戏逻辑(五)

    GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖, ...

  4. android开发用百度识别图片格式,Android开发学习之路-机器学习库(图像识别)、百度翻译...

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  5. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. 我们就 ...

  6. typescript学习之路(三) —— ts定义类的方法(包含es5以及es6的定义类)

    提起类,不得不说一下,强类型编程语言,如php,java,c++等都有类的概念.而js作为一门弱类型语言,是没有类这个概念的,虽然也能模拟类的实现,但总归不是类.so,ts也只是模拟类而已,使得更贴切 ...

  7. Android架构师之路

    很多Android的小伙伴在做了多年的开发之后,始终搞不清楚达到Android架构师需要何种技能,我们对比着Android高级工程师来说明. 我们先来看一下Android高级工程师的招聘要求 职位描述 ...

  8. Android的学习之路(三)项目的启动过程和安装过程具体解释

    应用的安装和启动过程: 安装:第一步:java的编译器会把这个.java文件编译成.class文件 第二部:Android的SDK提供了一个dx工具,这个工具把.class文件转义成.dex文件 第三 ...

  9. 数据架构学习之路(建议收藏)

    写在前面  早在1980年,未来学家阿尔文·托夫勒就在<第三次浪潮>中,将大数据比喻为"第三次浪潮的华彩乐章". 21世纪以来,数据量进入每两年翻一番的增长期,越来越多 ...

  10. Android感应检测Sensor(简单介绍),Android架构师之路

    实现以下两个SensorEventListener方法来监听,并取得感应检测Sensor状态: //在感应检测到Sensor的精密度有变化时被调用到. public void onAccuracyCh ...

最新文章

  1. luogu P3391 【模板】文艺平衡树(FHQ - treap,懒惰标记)
  2. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
  3. 浅聊程序化世界构建流程
  4. 机器学习基石-作业四-代码部分
  5. 如何用C++来计算大数字乘法
  6. iOS中如何添加自定义的字体库
  7. nginx master-worker进程间通信
  8. javascript Prototype constructor的理解(一)
  9. 【转】Java 5种字符串拼接方式性能比较。
  10. 赠书 | 原动力——改变未来世界的5大核心力量
  11. keil5.34设置GB2312编码后,字体不能改
  12. PXE网刻教程 教如何制作自己的DOS网卡驱动
  13. python 基类是什么,python 基类是什么意思
  14. 2018计算机专硕学硕,2018考生快上车!专硕VS学硕,究竟怎么选?
  15. android espresso 教程,Espresso 设置说明
  16. 开源的高性能Java集合:GNU Trove介绍
  17. 密钥对和AccessKey
  18. win10系统怎么做电影服务器,瞧瞧Win10是如何将电影推送到电视机上的
  19. [Power Query] 数据类型转换
  20. VM虚拟机中鼠标左键点击失效解决方案

热门文章

  1. 企业级用户画像: 价格敏感度模型-PSM
  2. 通过经纬度调用百度sdk api实现查询详细地址 Java
  3. C#本地化国际化解决方案实现简介
  4. 石灰窑计算机控制上料,石灰窑自动化控制系统
  5. Windows 下使用PDH 获取CPU 使用率
  6. 精品餐饮业奢华西餐专业PPT-朴尔PPT
  7. java swing tooltips_【Unity笔记】提示框ToolTips大小自适应,及其闪烁的问题
  8. 加速度传感器灵敏度表示的几种方式LSB/g,count/g,V/g,V/°
  9. Python求指定范围内质数与合数-详解
  10. Android开发基础之控件ImageView及第三方库Glide的使用