【Android】【架构】【页面】【MVC、MVP、MVVM】

架构分类

首先明确一点,MVC、MVP、MVVM是页面架构,把一个页面,分成几个部分管理,然后这几个部分进行交互
此外还有项目架构,比如组件化;还有模块架构,负责模块内部的解耦、通信机制

 

MVC

其思想是,拆分数据,拆分UI,同时设计一个中介层进行交互

 

MVP

和MVC最大的不同是,V和M不能直接交互

此外,你可以用2种方式进行思考:
1、V是事件的出发点
当你处理UI时,遇到了需要处理事件的时候,这个时候全权把任务交给P去分发
2、P是事件的出发点
事件流在P中进行,事件从P开始,然后V暴露刷新UI的口,M暴露得到数据的口,P写逻辑决定调用两者API的组合
要明白这2者的区别,否则和同事协同的时候,别人很可能对你的MVP提出质疑
这2个MVP优劣上并无太大区别
建议组内人怎么用,那就怎么用

 

MVVM

我的理解是MVVM = MVP + Databing
同时它也是数据驱动的模型

什么是数据驱动?
举个例子,RecyclerView
想更新它的视图有2个步骤:

  1. 修改adapter中的List
  2. adapter.notifyDataSetChanged()
    这就是数据驱动,你是先更改的数据,然后数据怎么对应刷新UI,adapter中的bind早有定义

什么是DataBinding?
假如adapter对List进行监听,一旦List变化就通知adapter,那么更新视图就剩下了一个步骤:
修改adapter中的List
这就是DataBinding

回顾三要素

  1. 数据
  2. 数据和UI的绑定逻辑
  3. 根据数据,调用绑定逻辑
    所以ViewModel的概念为:定义数据和UI的绑定逻辑,就像adapter的onBindViewHolder那样

如果你拥有Databing这样的自动化的框架,你的VM层可能就空空如也~
这无疑是极大的进步,非常推荐这个框架

 

EventBus

为什么这里会提到EventBus,着实古怪
其实前面的几个框架,尤其是MVC、MVP,存在大量的接口,这是他们的缺点之一
不过在拆分、解耦的过程中,使用抽象、接口来进行信息隔离,这也是不可避免的成本
而EventBus通过编译时注解缓存Method,对Method进行反射调用
消灭了所有接口
UI可以直接调用功能去获取数据,数据在获取完成后,通过EventBus post消息,UI只需要定义好刷新UI的方法
即可闭环整个链路
目前我们团队就在大量使用这个策略,虽说有些奇葩,但是却简单、高效

 

MVP + Clean

这是非常精妙的架构,分为3层,外层可以获知内层,内层无法获知外层

内层
1、Interator / UseCase
MVP里存在各个接口吧,一个页面用MVP去拆分,其实有若干个行为,存放在P层中
于是P层中的每个行为,在这里代表一个UseCase,拆分更彻底
内层不能获知外层,怎么回调UI呢?很简单,接口回调
2、Model
3、Repository
每个UseCase必然会调用到一些功能吧,最常见的就是网络请求、磁盘缓存
这里定义了这些功能,但是,只是接口,嘻嘻
4、Executor
即线程池,UseCase都是被期望运行在子线程中的

中层
1、Presenter
把接口传递给UseCase
2、Converter
外层也有Model,它主要是做内外层数据适配的,所以我觉得叫adapter更为合适

外层
1、UI
2、RepositoryImpl

 

架构选型

1、通常意义上,写一个Hello World,你又整DataBing,又整MVP Clean,又整EventBus
是否感觉有点冗余?
这就是不要过度设计
实际上,我们组的App规模很大,但我们写页面的时候还是不使用任何页面架构
因为我们平时做的需求都不会特别特别复杂
但是对于复杂度足够高的详情页等,我们采用的就是一种类似于MVP + Clean的模式
2、不专注于页面架构,因为有更重要的事做
页面架构是最小粒度的架构,在这之上还有模块架构,项目架构
首先调优这些架构,显然效率更高,有助于提升团队人效
页面架构的苛刻,一定程度和一定时期,反而可能会降低人效
3、如果项目发展到一定阶段,可以规范架构
这个时候,即使为HelloWorld写一套复杂的页面架构,也是有意义的,因为未来你无法确保这个HelloWorld页面是否会更复杂化
团队维护这样的规范是有意义的
4、个人对架构选型的看法
Databing框架是必须的,可以干掉大量的冗余代码
同时UseCase也是必须的,它可以最小粒度地划分页面里的业务逻辑
剩下的,需要根据项目的业务规模,业务特点,拉上同事共同敲定最符合项目的页面架构
5、高级MVP
记得以前学习过一些MVP框架,比较高级,带有生命周期,注解处理,简化MVP接入以及做了更好的处理,这些也可以学习下

 

后记

学习自
https://www.runoob.com/design-pattern/mvc-pattern.html
https://blog.csdn.net/qq_24442769/article/details/79469705
https://www.jianshu.com/p/7ae3095f2cb5
 

有什么写得错误、让人费解或遗漏的地方,希望可以不吝赐教,我会马上更改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值