最近因为换工作的原因没有写博客,现在慢慢稳定了,我准备写一些关于Android 进阶的文章,也是为了督促自己学习,大家一起进步!
今天详细的分析一下Android APP架构之一:MVC

### MVC简介

>[MVC](https://baike.baidu.com/item/MVC)全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

大家有对MVC不了解的直接去百度百科,这里就不做过多的讲解了。

### Android中的MVC

- M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。

- V层:应用层中处理数据显示的部分,XML布局可以视为V层(虽然很牵强)
- C层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据

MVC每层都有了解后,再对它构建一个导向图
![](https://img2018.cnblogs.com/blog/1312938/201908/1312938-20190831163125098-1442172398.png)

###### 我们为什么要用MVC?
我们在写项目的时候activity太臃肿,需要把View与Model进行分离,这样的好处:
1.耦合性低,利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离
2.方便维护
3.不用重复的写相同的业务逻辑,实现Model与Model之间的调用,Controller也可以直接调用Model 来实现代码复用

### 从实例中强化了解MVC

以之前做过的一个需求举例吧,“获取我的评论列表” 目的就是获取评论的数据,并显示出来
##### 步骤:
###### (1)
XML视图布局我这里就不再写了,无非就是按钮、列表控件以及需要更新的item布局控件

###### (2)
为了实现View模块与Model的交互 (也就是Model执行完业务逻辑之后,需要通知给View去展示数据) 我们需要定义一个**MyCommentListener**
```
public interface MyCommentListener {

/**
* 加载我的评论列表成功的回调
*/
void onMyCommentSuccess(MyCommentBean s);

/**
* 加载我的评论列表失败的回调
*/
void onMyCommentFailure();

}

```
###### (3)
Controller与Model交互,也就是C层告诉M层获取评论的请求, 它们之间的联系通过MyCommentModel

```
public interface MyCommentModel {

/**
* 获取我的评论列表信息
*/
void getMyCommentInfo(List list, String page, MyCommentListener myCommentListener);

}
```

###### (4)
实现获取评论列表的逻辑,这很显然是M层

```
public class MyCommentModelImpl implements MyCommentModel {

/**
* 获取我的评论列表
* @param list
* @param myCommentListener
*/
@Override
public void getMyCommentInfo(final List list, final String page, final MyCommentListener myCommentListener) {

//加载数据
NetService.getInstance().rxJavaGetMyComment(Constans.USER_ID,page,"10")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseSubscriber() {

@Override
public void handlerSuccess(MyCommentBean s) {

myCommentListener.onMyCommentSuccess(s);

}

@Override
public void onFailure() {
myCommentListener.onMyCommentFailure();
}
});
}
}
```

###### (5)
Activity或者Fragment实现**MyCommentListener**接口,看一下具体的回调:
```
/**
* 加载数据成功的回调
*/
@Override
public void onMyCommentSuccess(MyCommentBean s) {
//View做一些更新或者显示的操作
}

/**
* 加载数据失败的回调
*
* @param type
*/
@Override
public void onMyCommentFailure() {
//View做一些更新或者显示的操作
}

```

### 总结
1.mvc提高了代码的重用性
1.Model与Model之间可以调用,Controller也可以无障碍直接调用Model
2.Activity或者Fragment中 包含了C层和V层,界面分割的不是很清晰,过于紧密了...
3.View对Model过于依赖

大家可以关注我的微信公众号:「秦子帅」一个有质量、有态度的公众号!

![公众号](https://img2018.cnblogs.com/blog/1312938/201908/1312938-20190831163125248-1358696323.jpg)

Android进阶之路(1)-详解MVC的更多相关文章

  1. Android进阶之路(2)-详解MVP

    ### MVP简介 >MVP 全称:Model-View-Presenter :MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的[地方](https://baike.baidu.co ...

  2. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  3. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  4. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  5. Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...

  6. Android 之窗口小部件详解--App Widget

    Android 之窗口小部件详解--App Widget  版本号 说明 作者 日期  1.0  添加App Widge介绍和示例  Sky Wang 2013/06/27        1 App ...

  7. Android不规则点击区域详解

    Android不规则点击区域详解 摘要 今天要和大家分享的是Android不规则点击区域,准确说是在视觉上不规则的图像点击响应区域分发. 其实这个问题比较简单,对于很多人来说根本不值得做为一篇博文写出 ...

  8. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  9. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

随机推荐

  1. 使用.csv文件

    引用自:https://blog.csdn.net/vision_tung/article/details/79845758 通用爬虫:https://blog.csdn.net/Vision_Tun ...

  2. PageHelper分页实战(SSM整合)

    步骤一:引入SSM相关的jar包,包列表如下: 步骤二:创建或修改配置文件,配置文件清单如下: applicationContext.xml <?xml version="1.0&qu ...

  3. Ubuntu启动Apache

    划重点:最重要的是找到一个文件--------startup.sh 如果你是按照百度上的方法下载的Apache2,那么就按照百度的方式来 但是异曲同工 如果你是自己在网上下载的Apache到的磁盘 找 ...

  4. STL 大法好

    #include <vector>  1.支持随机访问,但不支持在任意位置O(1)插入:    2.定义:  ```cpp      vector<int> a;  ```  ...

  5. codeforces 318 A.Even Odds B.Sereja and Array

    A.Even Odds 给你n和k, 把从1到n先排奇数后排偶数排成一个新的序列,输出第k个位置的数. 比如 10 3  拍好后就是 1 3 5 7 9 2 4 6 8 10   第3个数是5. // ...

  6. CSS开启硬件加速来提高网站性能

    原文永久链接 CSS animations, transforms 以及 transitions 不会自动开启GPU加速,而是由浏览器的缓慢的软件渲染引擎来执行. 那我们怎样才可以切换到GPU模式呢, ...

  7. 补充Java面试记录

    补充Java面试记录 背景:这两天面试遇到的部分问题都分散在了前面两篇文摘中,这里再做一些其他的记录,以备不时之需! 一.谈谈你对SpringBoot的理解? SpringBoot简介:SpringB ...

  8. git的使用(一)

    git   —version  展示git的版本 tanya ~$ git --version git version 2.22.0 最小配置   git config —global user.na ...

  9. js中slice和splice的区别

    言简意赅,直接上货. slice():该方法会返回一个新的数组,强调:新数组,并不会影响原来的数组.先来看看语法咋说:arrayObject.slice(start,end).其中,start必需,e ...

  10. nginx基本运维及常用配置

    nginx基本运维及常用配置 ========================================================== 基本运维 nginx 的启动 nginx -c /p ...