# mvc_mvp_mvvm **Repository Path**: thumb_through/mvc_mvp_mvvm ## Basic Information - **Project Name**: mvc_mvp_mvvm - **Description**: android mvc、mvp、mvvp的简单例子 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-03-04 - **Last Updated**: 2023-03-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mvc_mvp_mvvm 推荐阅读地址:[语雀](https://www.yuque.com/imfondof/android/mvc_mvp_mvvm) 课程学习地址:[mooc](https://www.imooc.com/learn/1177) 代码地址:[github](https://github.com/Imfondof/mvc_mvp_mvvm)、[gitee](https://gitee.com/Imfondof/mvc_mvp_mvvm) (参考博客:[csdn:xjh_shin](https://blog.csdn.net/xjh_shin/article/details/104115997)) ## 简介 Android大型项目中,**为了达到模块内部的高聚合和模块间的低耦合性,提高项目的可维护性和可扩展性**,我们通常会使用一种框架模型,本门课程主要带大家认识学习Android的MVC-MVP-MVVM三种框架模型。在课程中除了会对比介绍每个模型的优缺点,还会结合代码案例来解析每个模型的使用。 ## 普通模式 有一个需求:我们需要查询用户账号信息,用户输入账号,点击按钮可进行查询账号信息,如果查询数据成功,则将数据展示在界面上;如果查询数据失败,则在界面上提升获取数据失败。 假如说我们不去使用框架来实现这个需求会是什么样子的呢? - 在layout里编写布局 - 在view(即activity编写一切代码) - - 获取用户输入信息 - 查询信息 - 业务逻辑 - 展示查询结果:成功或失败 代码: - bean - - [Account](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/bean/Account.java) - callback - - [MCallback](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/callback/MCallback.java) - normal - - [NormalActivity](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/normal/NormalActivity.java) [activity_normal.xml](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/res/layout/activity_normal.xml) #### 优缺点 优点:快速开发,便于理解 缺点:所有的功能都是堆积在一个Activity中的,导致Activity中代码的可复用性降低,Activity过于累赘。 而Android的框架就是来解决这些问题的,Android中的框架主要是有传统的MVC模式,以及Android中的MVP以及MVVM模式,那他们分别是什么呢? ## mvc 简介:MVC的全名是Model View Controller,即模型(model)- 视图(view)- 控制器(controller)。 - Controller 就是 Activity、Fragment 等(执行业务逻辑); - View 则是 layout, view 等控件; - Model 则对应的就是一些数据处理的逻辑,比如:网络请求,数据库,文件查询等。 ![20200119162623544.png](https://cdn.nlark.com/yuque/0/2020/png/345469/1587113286334-b199a7bb-94ff-48bd-b737-a0eae1c8ae4c.png) 我们对 View 进行点击会传递到 Controller 中,也就是 Activity 上,然后呢,Controller 就会通知给 Model,Model 对数据进行处理以后将结构返回给 View 进行展现。 比如我们将数据从 Controller 传递到 Model 上,可以让 Controller 持有 Model的引用,而 Model 要向 View 传递数据的话我们一般不会让 Model 持有 View 的引用,而是类似 CallBack 的注册监听的方式进行数据的传递。 代码: - mvc - - [MVCActivity](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvc/MVCActivity.java) - [MVCModel](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvc/MVCModel.java)(数据处理) [activity_normal.xml](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/res/layout/activity_normal.xml) #### 优缺点 (与普通模式没本质的区别) 优点:一定程度上的实现了 Model 与 View 的分离,降低了代码的耦合性。 缺点:Controller 与 View 难以完全解耦,并且随着项目复杂度的提升,Controller 将会越来越臃肿,Activity 承担了控制器的功能,又要承担部分视图层的工作。 ## mvp 简介:MVP 的全称为 Model - View - Presenter 模型,他是将 Model 和 View 隔离开来,两者之间不相互作用,而是通过 Presenter 作为一个中间件进行通信。 - Model 和 MVC 模式中的 Model 的功能是相同的,主要是做一些数据处理的功能; - View 就是直接对应了 Activity,Fragment 以及 layout 和 view 等控件;(以接口的形式体现) - Presenter 就是他们俩之间沟通的桥梁。(持有model和view 的引用) ![20200122170516200.png](https://cdn.nlark.com/yuque/0/2020/png/345469/1587113833341-dfe07c4b-fded-4b78-9ca4-00f550d59383.png) 业务逻辑处理部分代码从 MVC 中的 Controller 中取出,放入 Presenter 中。这样 Activity 的功能就被简化了,不再充当控制器,主要就是负责 View 层面的工作。 ![20200122175730988.png](https://cdn.nlark.com/yuque/0/2020/png/345469/1587113950273-494aec2c-2612-4a5f-8ab3-df1d15a9fd12.png) 代码: - mvp - - [IMVPView](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvp/IMVPView.java)(接口定义,用于activity继承,这样Presenter 可以调用 Activity 中实现的方法) - [MVPActivity](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvp/MVPActivity.java)(实现接口) - [MVPModel](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvp/MVPModel.java)(数据处理) - [MVPPresenter](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvp/MVPPresenter.java)(持有view和model的引用,通过 Presenter 我们向 Model 请求相关数据,并根据判断将结果返回 View 上面显示出来) [activity_normal.xml](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/res/layout/activity_normal.xml) #### 优缺点 优点:解决了 MVC 中 Controller 与 View 过度耦合的缺点,职责划分明显,更加易于维护。 缺点:接口数量过多,项目复杂的升高。随着项目的复杂度升高, Presenter 层将会越来越臃肿 使用建议:(为了一个目的:**减少接口的数量**) - 接口规范化(封装父类接口以减少接口的使用量) - - 比如封装view的父类、presenter的父类,使用constract契约接口将view和presenter写在一起,再分别去实现。 - 使用第三方插件自动生成 MVP 代码 - 对于一些简单的页面,可以选择不使用框架 - 根据项目的复杂程度,部分模块可以选择不使用接口 ## mvvm 简介:MVVM 的全称是 Model - View - ViewModel 模型,他的模型结构和 MVP 很相像,但是在代码逻辑上 MVVM 会显得更加简洁,其实他就是将 Presenter 换为了 ViewModel。 ![20200128172419205.png](https://cdn.nlark.com/yuque/0/2020/png/345469/1587114706983-dd15cc21-b5e2-4a6c-a0ee-6f3f5982ae2a.png) MVVM 在 MVP 的基础上实现了数据视图的绑定(DataBinding),这样的话就不用使用接口进行传递了,而是当数据变化的时候,视图会自动更新;反之,当视图发生改变的时候,数据也会进行自动更新。 好处: 1. 减少了接口数量 2. 不用使用 findViewById 去操控 View databinding简介 DataBinding 是谷歌官方发布的一个实现数据绑定的框架(实现数据与视图的双向绑定),DataBinding 可以帮助我们在 Android 中更好的实现 MVVM 模式。那我们[如何使用 DataBinding ](https://blog.csdn.net/xjh_shin/article/details/104211874)呢? 1. 在代码中启用 DataBinding(app/build.gradle启用) 2. 修改布局文件为 DataBinding 布局(alt+回车) 3. 数据绑定(添加viewmodel变量) 1. 1. textview可以使用 android:text="@{viewModel.result}" 进行单向绑定 2. editview可以使用 android:text="@={viewModel.input}" 进行双向绑定 (viewmodel需继承BaseObservable并重写get、set方法) 3. 单击事件:android:onClick="@{viewModel.getData}" 流程图和 MVP 的形式是一样的,只不过通讯手段从接口的形式变为了 DataBinding 的形式 ![20200128173610298.png](https://cdn.nlark.com/yuque/0/2020/png/345469/1587114988962-23ca2fb8-abe5-43c8-95b9-da4460a16f99.png) 代码: - mvvm - - [MVVMActivity](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvvm/MVVMActivity.java)() - [MVVMModel](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvvm/MVVMModel.java)(数据处理) - [MVVMViewModel](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/java/com/imfondof/mvc_mvp_mvvm/mvvm/MVVMViewModel.java)(绑定视图,持有model引用,进行业务逻辑) [app/build.gradle](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/build.gradle)(启用databinding) [activity_mvvm.xml](https://github.com/Imfondof/mvc_mvp_mvvm/blob/master/app/src/main/res/layout/activity_mvvm.xml) #### 优缺点 优点:实现了数据和视图的双向绑定,极大的简化代码 缺点:学习成本高(需要掌握databinding、livedata等更多知识),bug难以调试。