Android 进阶之设计模式 一 MVC模式
由于并非计算机科班出生,并且之前都是搞嵌入式的,使用的大多数是C语音,大家都知道C语音是面向过程的语言在设计模式方面强调得比较弱,其实在嵌入式设计中也有对应的设计模式,但是和这里要讲解的设计模式有较大的区别,在嵌入式设计中记得最深的就是策略与实现分开,这也是为什么需要有HAL层的原因,HAL层之上都是一些策略相关的东西,而HAL层之下则是一些与实际硬件相关的接口,HAL层通过一些接口将策略与实现结合起来。如果有兴趣了解这部分思想的话,大家可以看下实时嵌入式系统FreeRTOS,它是一个可以移植到各种嵌入式主控芯片上的操作系统,代码不多,但是麻雀虽小五脏俱全。之前研究生作项目的时候用的就是它。
好像扯远了,其实设计模式要解决的是如何尽可能得复用现有代码,如何使得框架以不变应万变。接下来的这几个专题将会介绍23种设计模式,MVC,MVP,MVVM等。在介绍这些内容之前我在这里先推荐几本自己觉得不错的书籍,干我们这行的基本都熟悉这几本书。
豆瓣链接:https://book.douban.com/subject/4260618/
豆瓣链接:https://book.douban.com/subject/5343318/
豆瓣链接:https://book.douban.com/subject/26644935/
买这本书有种失望的感觉,可能是我对它的要求太高了,个人觉得就是一本 设计之禪 + 源码解析,不过还是十分值得一读的。
豆瓣链接:https://book.douban.com/subject/1052241/
这边书我坦白说我没买过,大家都说好。有空的时候准备入手一本看看。
还有Head First 设计模式,大话设计模式,等等等等,反正豆瓣上一搜一大把,不过建议大家选一两本认认真真看下,空余时间找找博客看下就OK了,这些书看多了都一个样,无非就是介绍设计模式的时候背景故事换了一下,被字句换成把字句,把字句换成被字句罢了。
之前自己就是花了好长时间浪费在找书上面,但是学习这东西就像吃饭一样,不能说第3碗吃饱了,就否定前两份的价值,这东西说不准,大家实在这些书都觉得看不下去的时候可以到豆瓣上翻翻,然后下载电子档看下。
好了正式进入正题,介绍下MVC模式:
MVC模型
MVC模型分成三层 业务模型层-视图层(用户界面等信息展示部分)-控制层(控制器)是一种用业务逻辑、数据、界面显示分离的方法组织代码。
使用MVC的目的是将M(业务模型)和V(信息展示层)的实现代码分离,从而使同一个程序可以使用不同的表现形式。通过控制层来确保M和V的同步,一旦M改变,V能够同步更新。
下面是具体的职责分布:
- Model:是应用程序中用于封装与业务逻辑相关的数据以及对这些数据的处理方法。通常负责在数据库中存取数据。它对数据具有直接访问的权力,Module层不依赖视图层和控制层,换句话说,Module不关心它会被如何显示或如何被操作。它只负责接收存取数据的请求,一般而言Module中数据一旦发生变化都会通过消息机制发布。那些需要监听此模型的部分必须事先在此模型上注册监听事件,这种监听最常见的就是通过观察着模式来完成。
一般在项目中如果使用MVC模式的话都将为Model层分配两个package,一个是bean 用于封装数据模型,一个是Dao,用于封装对bean包数据模型的操作,最常见的就是从数据库中读出数据放到bean中,或者将bean数据写入到数据库,当然还有网络操作。 - View:是应用程序中处理数据展示的部分。通常视图是依据模型数据创建的,依赖于数据模型。一般不在视图层中进行业务逻辑处理,业务逻辑处理一般放在控制层。为了实现视图层的实时刷新,视图层需要实时监听数据模型的变化
- Controller:是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据,实际上是View层与Module层的衔接。
视图层View 与用户交互,在接收到用户的请求后,传送指令到控制层,在控制层当中完成业务逻辑处理,然后再发送请求到 Model 层要求改变状态,Model层接收到请求后将新的数据发送到视图层,视图层根据要求做对应的更新,并将数据展示给用户。
下面是在Android开发中较为常用的MVC模式:
我们以最简单的用户登入为例子,如果使用MVC模式开发,那么整个事件流如下,用户在登入界面上输入用户名和密码,然后点击登录按钮,这时候事件流到控制层,控制层对用户名和密码作初步处理后,将请求发送给Module层中的Dao,
Dao 通过网络发送登入请求,View同时通过观察着模式等方式监听Module中的变化,当Dao 从网络中获取到数据后封装到bean,然后通知View层来获取这个Bean,View层接收到这个事件后,取走bean,使用获取到的数据更新界面。
从下图中看到MVC的不足没?View与Model会有一定的交互。并且返回的数据并不通过Control层,如果需要在返回数据后需要做一些处理再更新View呢?是吧,所以就有了下一个博文所要介绍的MVP模式。