架构模式的理解

架构为了解决特定的问题而提出,按照特定的原则将系统整体进行模块/组件/角色的划分,建立模块/组件/角色间的沟通机制。

具体解释一下,首先是要有特定的问题,没有问题空谈架构,仿佛是空中楼阁,没有实用价值,而对应到不同的问题,会有不同的解决方式。

其次是模块的划分要根据特定的原则,没有原则随意划分,也就无从去评估一个架构的好坏。最后就是模块间的通信机制,让系统成为一个整体。

最后,架构模式,其实更多的是一种思想,一种规则,往往一种架构模式可能会有不同的实现方式,而实现方式之间,只有合适与否,并没有对错之分。

单个文件打天下

在早期的Android应用开发中,由于刚开始的业务逻辑还比较简单,为了快速开发,并没有在项目初期就决定采用什么架构模式,一个明显的特点就是处理逻辑都集中在了 Activity / Fragment 中,不管是对 View 的操作,还是对数据的处理。带来的问题就是 Activity / Fragment 中逻辑臃肿,后续扩展牵一发而动全身。而且职责划分不清晰,给后续维护也带来了困难。慢慢的根据前辈的经验积累演化出了MVC、MVP、MVVM等编码模式。

MVC

MVC 架构里,将逻辑,数据,界面的处理划分为三个部分,模型(Model)-视图(View)-控制器(Controller)。各个部分的功能如下:

  • Model 模型,负责数据以及对数据的操作。
  • View 视图,负责界面的展示。
  • Controller 控制器,负责逻辑控制。

MVC 就要解决的问题就是:控制逻辑,数据处理逻辑和界面交互耦合。

在MVC中通信方式是这样的:在 MVC 架构中,View 产生事件,通知到 Controller,Controller 中进行一系列逻辑处理,之后通知给 Model 去更新数据,Model 更新数据后,再将数据结构通知给 View 去更新界面,这就是一个完整 MVC 的数据流向。

优点

结构清晰,职责划分清晰;降低耦合;有利于组件重用

缺点:

其实在 Android 开发中,一般来说,Activity / Fragment 会承担 View 和 Controller 两个角色,就会导致 Activity / Fragment 中代码较多,Model 直接操作 View,View 的修改会导致 Controller 和 Model 都进行改动,增加了代码结构的复杂性。

MVP

MVP 架构里,将逻辑,数据,界面的处理划分为三个部分,模型(Model)-视图(View)-控制器(Presenter)。各个部分的功能如下:

  • Model 模型,负责数据的加载和存储。
  • View 视图,负责界面的展示。
  • Presenter 控制器,负责逻辑控制。


MVP 要解决的问题和 MVC 大同小异:控制逻辑,数据处理逻辑和界面交互耦合,同时能将 MVC 中的 View 和 Model 解耦。MVP 和 MVC 最大的不同,就是 View 和 Model 不相互持有,都通过 Presenter 做中转。

在MVP中通信方式是这样的:View 产生事件,通知给 Presenter,Presenter 中进行逻辑处理后,通知 Model 更新数据,Model 更新数据后,通知数据结构给 Presenter,Presenter 再通知 View 更新界面。
这就是一个完整 MVP 的数据流向。

优点

结构清晰,职责划分清晰;模块间充分解耦;有利于组件的重用

缺点

会引入大量的接口,导致项目文件数量激增;增大代码结构复杂性

MVVM

MVVM 架构里,将逻辑,数据,界面的处理划分为三个部分,模型(Model)-视图(View)-逻辑(ViewModel)。各个部分的功能如下:

  • Model 模型,负责数据的加载和存储。
  • View 视图,负责界面的展示。
  • ViewModel 控制器,负责逻辑控制。

MVVM 要解决的问题和 MVC,MVP 大同小异:控制逻辑,数据处理逻辑和界面交互耦合,并且同时能将 MVC 中的 View 和 Model 解耦,还可以把 MVP 中 Presenter 和 View 也解耦。

我们可以看到,MVP 中的各个角色划分,和 MVC,MVP 基本上相似,区别也是在于角色的通信上。
我们上面说到,在 MVP 中,就是 View 和 Model 不相互持有,都通过 Presenter 做中转。这样可以使 View 和 Model 解耦。
而在 MVVM 中,解耦做的更彻底,ViewModel 也不会持有 View。其中 ViewModel 中的改动,会自动反馈给 View 进行界面更新,而 View 中的事件,也会自动反馈给 ViewModel。要达到这个效果,当然要使用一些工具辅助,比较常用的就是 databinding
在 MVVM 中数据的流向是这样的:View 产生事件,自动通知给 ViewMode,ViewModel 中进行逻辑处理后,通知 Model 更新数据,Model 更新数据后,通知数据结构给 ViewModel,ViewModel 自动通知 View 更新界面。这就是一个完整 MVVM 的数据流向。

优点

结构清晰,职责划分清晰;模块间充分解耦;在 MVP 的基础上,MVVM 把 View 和 ViewModel 也进行了解耦

缺点

Debug 困难,由于 View 和 ViewModel 解耦,导致 Debug 时难以一眼看出 View 的事件传递;代码复杂性增大

总结

上面的文章中,我们介绍了 MVC,MVP,MVVM 三种架构模式,以及其简单的实现。这里我们再回过头思考一下,什么时候该使用架构模式呢?

架构模式可以使代码模块清晰,职责分工明确,容易扩展,带来的副作用就是会引入大量的接口,导致代码文件数量激增。

我们在最开始说过,架构模式是用来解决特定的问题的,如果特定的问题在目前阶段不是问题,或者不是主要问题,那么我们可以先不考虑使用架构模式。比如一个功能非常简单,代码量少,而后续又没有扩展的需求,那我们直接使用传统方式进行开发,快速且清晰,完全没有必要为了架构而架构。对于在开始没有考虑架构模式的代码,后续慢慢去重构,也是一个好的选择。

Android编码架构MVx演进历史相关推荐

  1. 余额宝技术架构及演进------阅读

    余额宝开启了划时代的意义,开启了全民理财时代. 阅读这篇关于架构的内容,感想最大还是处于大数据时代.余额宝的数据量之大不是我们能想象到的,文章将余额宝的数据来源分为:业务数据.日志数据和其他数据.现在 ...

  2. 余额宝技术架构及演进——阅读笔记13

    原文链接:https://mp.weixin.qq.com/s/9ArciW8SDLk8rTUSpD1oWw 余额宝开启了划时代的意义,开启了全民理财时代. 阅读这篇关于架构的内容,感想最大还是处于大 ...

  3. 微信Android客户端架构演进之路

    去年7月,笔者在InfoQ举办的ArchSummit深圳2014的架构师峰会上,分享了微信Android客户端的架构演进史.可以说,这是一个典型的Android应用在从小到大的成长过程中的" ...

  4. 抖音、美团等大厂千万级用户的Android客户端架构演进之路—

    在移动开发中,对开发者来说不同的人具有不同的能力.就像读一本书一样,一千个读者,有一千个哈姆雷特.但不管怎样,只要你是个软件开发者你就必须学习windows或Linux等操作系统的运行原理.Andro ...

  5. 人人车Android客户端架构演进实录

    前言 对于大多数创业公司而言, 初版开发时采用的简单架构,在历经数次快速迭代后,已经成为了一个"大泥球"(源于Brian Footer和Joseph Yonder的论文<大泥 ...

  6. 团贷网Android客户端架构演进之路(下)

    在上一篇<团贷网Android客户端架构演进之路(上)>中,我们为大家介绍了架构演进.业务重构的过程.在本篇中,我们会从CI出发,在新架构背景下,如何提高研发效率和质量,如何做好架构的维护 ...

  7. 微信Android客户端架构演进及其对开发流程的影响

    微信Android客户端架构演进及其对开发流程的影响 http://www.infoq.com/cn/presentations/android-client-architecture-evoluti ...

  8. 视频大时代下基础架构的演进

    点击上方"LiveVideoStack"关注我们 过去十年,随着端上算力和通讯能力的提升,我们见证了一个业务玩法日趋复杂.用户覆盖遍及全球的视频大时代的诞生.近几年,多个市值千亿以 ...

  9. Android项目架构设计深入浅出

    简介:本文结合个人在架构设计上的思考和理解,介绍如何从0到1设计一个大型Android项目架构. 作者 | 璞珂 来源 | 阿里技术公众号 前言:本文结合个人在架构设计上的思考和理解,介绍如何从0到1 ...

  10. 从0到千万DAU,这5年闲鱼架构如何演进?

    阿里妹导读:闲鱼品牌创立于14年阿里的某个茶水间,从0开始到现在千万DAU,5年时间里闲鱼见证了闲置物品从线下到线上交易的转移.而线上交易的繁荣,则需要业务架构做相应的调整.演进才能支撑业务的快速发展 ...

最新文章

  1. centos安装Hue 3.7.0
  2. 微型计算机的主要硬件以及技术指标,微型计算机主要技术指标
  3. zepto返回顶部动画
  4. CISA:很多受害者和 SolarWinds 之间并不直接相关
  5. 【深度优先搜索】计蒜客:正方形
  6. 通过stream去重_分享几种 Java8 中通过 Stream 对列表进行去重的方法
  7. 计算机ec键起什么作用,主板acpi 隐形的管家——EC的EC控制器芯片芯片手册
  8. 计算机考证广东省ps
  9. 计算机网络系列选择题
  10. 台式计算机刚做完系统就蓝屏,做完系统蓝屏怎么办|刚做完系统重启电脑蓝屏解决方法...
  11. Word文档标题自动增加序号
  12. 赏析角度有哪些_诗词赏析-怎样赏析诗词的技巧-诗句赏析的角度有哪些
  13. 设计模式-建造者模式(5)
  14. nc6单据模板设置没有可选的模板问题解决
  15. 全球及中国游戏耳机市场运营模式分析及需求前景预测报告2022年版
  16. 【VUE】2、VUE-CREATE创建第一个VUE项目
  17. 【编程笔试】美团2021校招笔试-通用编程题第9场(附思路及C++代码)
  18. android 加固服务器,服务器加固工具
  19. windows无法连接到打印机?三个方法连接打印机(Win10系统)
  20. html语言margin,margin在html中的意思

热门文章

  1. 计算机学会a类论文是sci吗,什么是SCI、EI、CCF、DASFAA
  2. 【科研分享】推荐系统SCI顶会及顶级期刊 更新于2022-07-13
  3. 【HANA系列】SAP 一位SAP培训顾问的建议:SAP HANA应该如何学习?
  4. request和request.form和request.querystring的区别
  5. 使用 FireDAC的 TFDConnection, TFDQuery 最初只能显示50条记录,TDateSet.RecordCount总是获得50的解决方法。
  6. As3.0 中影片剪辑调用
  7. Qt 给文本添加删除线 text-decoration
  8. 【场外衍生品系列】雪球结构定价研究
  9. python有道云笔记_GitHub - IthacaDream/youdaonote-pull: 一个一键导出 / 备份「有道云笔记」所有笔记的 Python 脚本...
  10. python中用于进行web开发的第三方库是_10款Web开发最佳的Python框架