Android面试题:MVC、MVP、MVVM

MVC模式:

MVC结构:

1.MVC(Model-View-Controller)

2.Model:对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算,变更等操作也是必须放在的该层的。

3.View:主要包括一下View及ViewGroup控件,可以是系统控件也可以是自定义控件。4.Controller:Android的控制层通常在Activity、Fragment之中。从Model层获取数据,将获取到的数据绑定到view上,并且还需要监听用户的输入等操作。

本质就是Controller操作Model层的数据,并且将数据返回给View层展示。

MVC的优点:

1.分工明确,各司所职。

2.一定程度上降低了代码间的耦合性。

MVC的缺点:

1.随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿

2,视图和控制器间过于紧密的联系,妨碍了各自的重用

MVP模式:

MVP结构:

1.MVP(Model-View-Presenter)

2.Model:主要提供数据的存储功能。Presenter需要通过Model存取数据。

3.View: 负责处理点击事件和视图展示(Activity、Fragment或者某个View控件)

4.Presenter: View和Model之间的桥梁,从Model检索数据后返回给View层。使得M/V之间不再有耦合关系。

MVP和MVC的区别

1.MVP中绝对不允许View直接访问Model

2.本质是增加了一个接口降低一层耦合度

MVP的特点

1.Presenter完全将Model和View解耦,主要逻辑处于Presenter中。

2.Presenter和具体View没有直接关联,通过定义好的接口进行交互。

3.View变更时,可以保持Presenter不变(符合面向对象编程的特点)

4.View只应该有简单的Set/Get方法、用户输入、界面展示的内容,此外没有更多内容。

5.低耦合:Model和View的解耦,决定了该特性。

MVP的优点

1.低耦合 :Model、View层的变换不会影响到对方。

2.可重用性 :Model层可以用于多个View。比如请求影视数据,可能有多个页面都需要这个功能,但是Model层代码只要有一份就可以了。

3.方便测试:可以单独对Model层和View层进行测试。

MVP的缺点

1.MVP的中使用了接口的方式去连接view层和presenter层,如果有一个逻辑很复杂的页面,接口会有很多,导致维护接口的成本非常大

解决办法:尽可能将一些通用的接口作为基类,其他的接口去继承

MVVM模式:

MVVM结构:

1.MVVM(Model-View-ViewModel),将Presenter替换为ViewModel。

2.View层就是展示数据的,以及接收到用户的操作传递给viewModel层,通过dataBinding实现数据与view的单向绑定或双向绑定

3.Model层最重要的作用就是获取数据了,当然不止于此,model层将结果通过接口的形式传递给viewModel层

4.ViewModel 层通过调用model层获取数据,以及业务逻辑的处理。 MVVM中 viewModel 和MVP中的presenter 的作用类似 ,只不过是通过 databinding 将数据与ui进行了绑定。

MVVM的优点

1.双向绑定技术 ,当Model变化时,View-Model会自动更新,View也会自动变化。很好做到数据的一致性,不用担心,在模块的这一块数据是这个值,在另一块就是另一个值了。所以 MVVM模式有些时候又被称作:model-view-binder模式。

2.View的功能进一步的强化 ,具有控制的部分功能,若想无限增强它的功能,甚至控制器的全部功几乎都可以迁移到各个View上(不过这样不可取,那样View干了不属于它职责范围的事情)。View可以像控制器一样具有自己的View-Model.

3.由于控制器的功能大都移动到View上处理,大大的对控制器进行了瘦身。不用再为看到庞大的控制器逻辑而发愁了。

MVVM的缺点

1.数据绑定使得 Bug 很难被调试 。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。

2.一个大的模块中,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当时长期持有,不释放内存,就造成了花费更多的内存

3.数据双向绑定不利于代码重用。客户端开发最常用的重用是View,但是数据双向绑定技术,让你在一个View都绑定了一个model,不同模块的model都不同。那就不能简单重用View了。

相关推荐
STCNXPARM7 小时前
Android camera之硬件架构
android·硬件架构·camera
2501_944525548 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
松☆10 小时前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
_李小白11 小时前
【Android 美颜相机】第二十三天:GPUImageDarkenBlendFilter(变暗混合滤镜)
android·数码相机
小天源14 小时前
银河麒麟 V10(x86_64)离线安装 MySQL 8.0
android·mysql·adb·麒麟v10
2501_9159214314 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone
csj5015 小时前
安卓基础之《(20)—高级控件(2)列表类视图》
android
JMchen12315 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
恋猫de小郭17 小时前
Flutter 在 Android 出现随机字体裁剪?其实是图层合并时的边界计算问题
android·flutter·ios
2501_9159184117 小时前
把 iOS 性能监控融入日常开发与测试流程的做法
android·ios·小程序·https·uni-app·iphone·webview