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?
***面向对象也是需要一个状态去控制的,比如人的大脑。通过大脑去协调手和脚的平衡。