MVC全称是Model-View-Controller 也就是模型–视图–控制器。是在1970年的时候提出由TrygveReenskaug在Smalltalk-80系统上首次提出的。
SmallTalk在百度百科的解释是这样:
Smalltalk被公认为历史上第二个面向对象的程序设计语言和第一个真正的集成开发环境 (IDE)。
来张图说明一下MVC的工作模式吧
图中红色小框框就是MVC的工作模式
- 从图中可以看出用户向View发送指令,再有View直接要求Modle改变状态
- 用户也可以直接向Controller发送指令,再由Controller发送给Model,在通过Model去改变View的状态
- 所以MVC框架模式View和Model之间的联系还是相当紧密的,耦合度还是很高,后期维护改动View需要将Model中的内容也要改动。
MVC是一种框架模式而非设计模式
其优点是:
- 理解起来比较容易,技术含量并不高,对开发和维护来说易于维护和修改
- 耦合度不高,表现层与业务层分离,各司其职。
其缺点是:
- 它定义不是很明确,完全理解MVC模式并不容易。
- 使用MVC需要精心策划,因为你它的内部原理比较复杂
- 一些小的项目采用MVC框架反而会更加复杂
MVC的Android伪代码实现
以下图片中代码与数据不匹配,只是为了方便理解MVC在代码中如何写,需要看实例的可以去网上了解,我在这里就偷懒了:)
- 首先你需要一个View视图,也就是XML布局。
- 然后你还需要一个Model
也就是数据,可以是数据库中的内容,也可以是在代码中写的List集合。
- 最后需要一个Controller,也就是Activity或者Fragment
通过在Controller中对用户在View中传递过来的操作,进行访问model中的数据,然后改变View中的状态。
MVP是MVC的一个演化版本,全称是Model-View-Presenter。
MVP的出现主要就是解决MVC中的View和Model的耦合性高的的问题,同时又带来了很好的扩展性。
MVP模式的三个角色的作用:
- Presenter-中介
主演沟通View和Model的桥梁,他从Model获取数据后返回给View层,是的View层和Model层之间没有耦合,从而奖业务逻辑从View层抽离。
- Model-房主
Model主要提供数据的存取功能,Presenter需要通过Model层存储、获取数据,Model层就像是一个仓库。
- View-用户
View通常是指Activity、Fragment或者某个View控件。它含有一个Presenter成员变量,同时它需要实现一个逻辑接口,奖View上的操作转交割Presenter进行实现,最后Presenter调用View逻辑接口将结果返回给View元素。
来张图说明一下MVP的工作模式吧
从图中我们可以看出MVP和MVC之间的额最大区别:
- VIew和Model之间彻底的解耦
- MVP是面向接口编程,也就是说用户不必知道我是具体如何实现额,用户只要知道有这个功能,直接调用即可。
MVP的Android伪代码实现
以下图片中代码与数据不匹配,只是为了方便理解MVC在代码中如何写,需要看实例的可以去网上了解,我在这里就偷懒了:)
- 首先需要一个Presenter,作为View和Model的中间人
- 然后你还需要一个View以及ViewImpl接口
- 最后你还需要Model一个ModelImpl接口
为什么说不必纠结是MVC还是MVP呢?
MVC和MVP的最终目的就是要数据和UI分离,互相不影响。那么如何能不必纠结而做到呢??你听说过面向对象吗?听过再听听我的理解~
- 面向对象
封装、多态,继承。老师好像也都是这么教的,那么到底说明是多态封装继承呢?
- 封装
封装就是将用户不想看到的东西封装起来,可以用到面向对象中的 Private
属性,将用户不想看到的内容写在这里面。比如收音机上的播放功能,用户不用知道收益及如何播放,它只需要知道摁下这个键能播放即可。
- 多态
多态就是一个对象的多种表现形态,主要表现为:行为多态和状态多态。
行为多态就好比一个父亲有多个孩子,每个孩子都不一样,但是都是同一个父亲;状态多态就好比每个孩子在一天中有好多个状态变现,有吃饭,学习,睡觉。
- 继承?不!我想说的是对象!
我的一个朋友告诉我继承其实是对面向对象的最大误解。继承我们可以理解成一个对象他有多个小对象组成;比如人这个对象是由手脚,脑袋…等其它小对象组成。因此继承我们可以不去记住,我们只要对每个对象有深刻的认识即可把对象描述清楚!
那么MVC、MVP与面向对象有什么关系呢??
首先MVC和MVP都是要求数据和UI之间互不影响,那么面向对象不就是吗!?
- 面向对象View?
对象也就是我们说的用户也就是MC或者MVP中View,用户需要什么我们就展示给其什么,不需要的我们将其封装起来提供一个方法给你调用即可,这是不是和MVC或者MVP中很像!
- 面向对象Model?
同时面向对象也是需要将对象的行为细分,比如人可以跑,可以游泳…这是不是和MVC中的Model一样,需要处理用户不同的操作。
- 面向对象Controller?
最后面向对象也是需要一个状态去控制的,比如人的大脑。通过大脑去协调手和脚的平衡。
作者:Aller_Dong
来源:51CTO