赞
踩
先说MVC,MVC全称Model View Controller,一种软件设计典范,也就是说这个东西不是Android专有,其他平台软件设计的时候也会用到这个设计方法。
但是不得不说的是,MVC的讲解会比较混乱,很有可能会出现你翻了十个博客,然后MVC的关系图会出现七八种的这种情况。
描述 | Android中的对象 | |
Model(模型) | 负责提供数据模型以及处理,也负责在数据更改的时候提醒视图。 | Model类 |
View(视图) | 数据的可视化,也就是让用户看到数据。 | xml文件,自定义View类,自定义Layout类 |
Controller(控制器) | 负责处理用户交互。 | Activity,Fragment |
这么说肯定不太好理解,我举一个简单的例子。
前提:app中只有MainActivity一个界面,界面上就一个Textview和Button。
目标:点击button后等待3秒,生成一条随机内容的String,然后删除String中的数字和空格,最后输出到界面上,然后在5秒后,再输出一条新的String删除数字空格后到界面上。
那么在这个例子中,每个层该做什么呢?
Button的按钮监听会不统一的可能写在View(自定义View)也可能写在Controller(Activity)中。
也有一种说法是Controller负责数据的加工处理,这种情况下String的删除数字和空格会交由Activity来做,且Controller层和Model层会变成两个相互的箭头。这个内容我会在MVP里说。
这么一举例,就可以明显的发现MVC的优点了:
与此同时,MVC的一些缺点就显示出来了:
MVP是基于MVC而生成的,所以明白了MVC,就可以容易理解MVP模式。
MVP全称Model View Presenter,当然也是设计典范。
描述 | Android中的对象 | |
Model(模型) | 负责提供数据模型。 | Model类 |
View(视图) | 数据的可视化。 | 主要是Activity,Fragment |
Presenter/Controller(都叫Presenter了,找不到中文) | 负责处理用户交互和数据加工。 | Presenter类/Controller类 |
之前MVC的关系图看的确实是有些混乱,一些指向又是实线又是虚线的,然后还弄了个三角关系。但是在MVP中,P层是完全隔断了V层和M层的联系,成为了一个中间地带。
对比一下MVC层,再看看MVP层中做了哪些不同的事吧,用一个具体的例子来举例(其实就是MVC的例子,防止翻回去看,在下面复制了一遍)。
前提:app中只有MainActivity一个界面,界面上就一个Textview和Button。
目标:点击button后等待3秒,生成一条随机内容的String,然后删除String中的数字和空格,最后输出到界面上,然后在5秒后,再输出一条新的String删除数字空格后到界面上。
那么在这个例子中,每个层该做什么呢?
你会发现,我上面MVC所说的Controller层负责数据的加工,其实和MVP的内容很相像,其实就差不多是MVP那意思了。
那么对比MVC,MVP做了哪些改进:
但是MVP模式也依旧有一些缺点:
接下来就可以说MVVM的模式了,这个MVVM有说是从MVC来的,也有说是MVP来的,我这里就当做是MVP来的。
MVVM全称Model View ViewModel,这里请不要误会,虽然是MVVM,但是实际上也是三层,第三层就是VM层。
描述 | Android中的对象 | |
Model(模型) | 负责提供数据模型。 | Model类 |
View(视图) | 数据的可视化。 | 主要是Activity,Fragment |
ViewModel | 负责处理用户交互和数据加工。 | ViewModel类 |
一看之下MVVM看上去和MVP的区别不大,现在来介绍一下两者的区别。
在MVVM中,VM层取代了原先的P层,然后两者之前的两个箭头变成了一个双向箭头,这就是MVVM相对于MVP的变化。
VM层和V层在MVVM中实现了一个双向的数据绑定,在他们中间还隐藏了一个绑定器Binder。
我之前看了很多MVVM介绍的博客,他们都说到了数据绑定这个词,那么什么是数据绑定?我再举之前那个例子。
前提:app中只有MainActivity一个界面,界面上就一个Textview和Button。
目标:点击button后等待3秒,生成一条随机内容的String,然后删除String中的数字和空格,最后输出到界面上,然后在5秒后,再输出一条新的String删除数字空格后到界面上。
在之前MVP模式中,V层的任务是绑定控件和显示String的内容到TextView上。也就是说,无论如何一定会调用到textview.setText(string);这个方法对吧,但是在MVVM模式中,你可以不用再调用setText了。MVVM中只要string这个变量一更新,Textview就会自动显示更新后的值,这就是数据绑定。
了解了数据绑定后,再来看看MVVM中每个层的具体任务:
那么,说了这么久绑定器绑定器的,这个绑定器又到底是个啥?
别的语言我不太清楚,但是在Android中,google公司特地的推出了一个DataBinding框架,这个东西就是我们实现绑定器的具体工具了。所以经常会看到Android MVVM的介绍博客说着说着就变成DataBinding的介绍,要注意两者是完全不同的东西,一个是设计典范,一个是工具!
关于DataBinding怎么使用,参考这篇:
Android DataBinding 从入门到进阶 - 简书
https://www.jianshu.com/p/bd9016418af2
最后再总结一下MVVM相对MVP的改进:
以及MVVM的缺点:
MVC 模式 | 菜鸟教程
https://www.runoob.com/design-pattern/mvc-pattern.html
MVC框架_百度百科
https://baike.baidu.com/item/MVC%E6%A1%86%E6%9E%B6/9241230?fromtitle=mvc&fromid=85990&fr=aladdin
Android App的设计架构:MVC,MVP,MVVM与架构经验谈-android,mvp,mvc 相关文章-天码营
https://www.tianmaying.com/tutorial/AndroidMVC
https://blog.csdn.net/huangliniqng/article/details/85804875
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。