Android MVC MVP MVVM

Android MVC MVP MVVM

注:
本篇文章中,提供的MVC MVP MVVM 写法的Demo,与Google的标准写法会存在些许不一样(本文案例demo是基于google的标准写法和本身这几年的工做总结,进行调整后的写法,自认为很是适合本身也比较适合大众的写法)android

MVC

MVC的关系图以下:git

这里写图片描述

以前作过一个变种MVC的Demo:
https://github.com/xiaxveliang/Android_APPArchitecture_Demo/tree/master
该Demo的相关文档介绍:
https://blog.csdn.net/xiaxl/article/details/72593945github

MVP

MVP模式是对MVC模式的改进web

  • 将Activity亦看作是一个View,负责UI展现;
  • 抽象出一个Presenter层,处理业务逻辑操做;
  • Model层用来获取"Remote数据"或"已缓存到本地的数据";

View与Presenter、Model与Presenter均经过接口进行数据交换,从而实现Model层与View层进行解耦。缓存

todo-mvp

Model、View、Presenter的关系以下图因此:架构

这里写图片描述

对MVP最好的了解方式,实际上是googlesamples的todo-mvp的demo:
googlesamples的todo-mvpdom

对 todo-mvp 不进行介绍…mvvm

我喜欢的MVP写法

googlesamples的todo-mvp的代码相对较多,这里我作了一个简单Demo (这个Demo是我喜欢的写法),源码地址以下:
Android_APPArchitecture_Demo 工程 normal_mvp 分支svg

这里的Demo与google的todo-mvp 有些不一样,具体表如今:google

  • Presenter只负责Model与View的解耦,不包含相关业务逻辑操做;Presenter拿到Model的数据后,不作任何处理直接回调到对应的Activity;
  • Activity拿到数据后,根据数据直接更新UI。

为何这么写,这里有一个思考:

怎么样写业务代码更简单,我认为"只作UI展现"不包含“用户交互”的业务逻辑最简单。那有没有一种代码的写法,能够把用户操做,转化为一种UI的更新操做?

这里我给出的方案是:将“用户交互”转化为一种数据更新

  • 用户对View的操做,所有回调到对应的Activity;
  • Activity经过持有的Presenter 向对应的Model 请求数据资源,最终会被转化为UI更新;

架构图以下:

这里写图片描述

MVVM

todo-mvvm-databinding

Model、View、Presenter的关系以下图因此:

这里写图片描述

对MVVM最好的了解方式,实际上是googlesamples的todo-mvvm-databinding的demo:
googlesamples的todo-mvvm-databinding

对 todo-mvvm-databinding 不进行介绍…

作了一个Demo

googlesamples的todo-mvvm-databinding的代码相对较多,这里我作了一个简单Demo (这个Demo是我喜欢的写法),源码地址以下:
[Android_APPArchitecture_Demo 工程 normal_mvvm 分支]
https://github.com/xiaxveliang/Android_APPArchitecture_Demo/tree/normal_mvvm

========== THE END ==========