美文网首页
MVC MVP MVVM的学习总结

MVC MVP MVVM的学习总结

作者: 132xin | 来源:发表于2020-08-03 22:38 被阅读0次

在没有使用框架的时候,在进行开发的时候,会发现界面,请求数据,显示数据等逻辑都是写在Activity,虽然在小项目阶段,这样做还可以。但是随着项目的增大,代码的行数越来越多,这样的做法会使Activity这个类越来越臃肿,不仅可读性差,而且耦合性更差。在大项目的使用框架,不仅可以提高效率,为以后的维护也带来了很大的变量。
接下来我们逐一学习和总结MVC,MVP,MVVM

MVC

MVC的结构图


image.png

Model(模型层)

程序操作数据和信息,例如查询数据,更新数据和数据存储等,Model层与View存在耦合,数据更新之后Model通知UI更新,有时候View也会直接操作Model层,Model层还会接收Controller层的事件。

View(视图层)

是直接面向用户的试图层,提供用户操作界面,用来展示Model的层的数据,该层的目的是只展示数据,同时还会相应用户的交互触发Controller层的逻辑,View层还可以直接操作Model层还刷新UI

Controller(控制器层)

Controller由View根据用户行为触发,并响应来自View的交互,然后根据View的事件逻辑修改对应的Model,Controller并不关心View如何展示数据或状态,而是通过修改Model并由Model的事件机制来触发View的刷新。

在Android中的MVC结构:

View接收用户的操作事件,一般是XMl,控件等。
Controller根据用户的触发事件对Model进行操作
Model的数据发生更新后,Model通知View进行更新
View显示更新后的数据

Android中对应的角色

Model 适合做操作数据的业务逻辑层,例如请求网络加载数据,操作数据库等。
View是XML,控件等界面元素
Controller :适合是Activity,用于处理用户的输入事件。

MVC的优缺点

优点:

耦合性降低,MVC本质是分层耦合,将表现层与表现逻辑很好的分离,减少代码之间的相互影响。
可扩展性好,由于耦合性低,在增加需求时,改动小,bug出现的机率小。
有利于代码的维护,MVC三层分工明确,模块职能划分明确。

缺点

由于View和Model层相互可知,故存在耦合性。
在Android开发中,因为View层的XML控制力比较弱,通常Activity既是View层又充当Controller层,随着项目的增大,Activity的代码会变得臃肿。

MVC适合的场景

适合功能较少,业务逻辑简单,界面不复杂的小型项目。

MVP

MVP的结构图:


image.png

MVP是MVC进一步优化的体现,MVP的组成元素:

Model(数据的存取)

Model的角色主要是提供数据存取的功能,不与View层进行直接的交互,而是同Presenter,Presenter需要通过Model层存取数据,就像一数据仓库,即是完全数据请求,数据库的所有操作都是在Model层。

View(用户界面)

View通常是指用户界面,在Android很多时候是指Activity,Fragment和View控件等,View层含有一个Presenter的成员变量,通过Presenter,通过Presenter去操作Model,通常View需要实现一个逻辑接口,将View上的操作交给Presenter,最后调用View逻辑接口将结果返回到View层。

Presenter(交互中间人)

Presnter的主要作用是View和Model的桥梁,它从Model中读取数据,然后返回View,而不是由View去操作Model读取数据,使得View和Model进行分离,没有耦合,也就将业务逻辑从View中分离出来。

在Android中的MVP结构:

1.View接收充当界面,接收用户的请求
2.View通过Presenter暴露的接口将请求数据交给Presenter处理。
3.Presenter通过Model暴露的接口对Model进行操作
4.Model的数据发生变化之后通知Presenter(使用RxJava可以轻易处理数据变化后通知Presenter,不需要编程回调接口等)。
5.Presenter通过View的接口更新View。

MVP的优缺点

优点:

  • 将业务逻辑放在Presenter层,降低了View层的复杂性
  • 将View层和Model层完全解耦,两者之间没有直接的联系,保证了系统的扩展性和维护性。
  • 解决了MVC模式中Activity,Fragment既是View层又是Controller层的问题,Activity,Fragment只充当View层,View层和Model层的复用性得到提高。
  • 各层的分工明确,便于单元测试

缺点

  • 随着项目不断增大,Presenter层的代码可能会越来越臃肿。
  • MVP是以UI为驱动的模型,更新Ui时保证获得UI控件的引用的同时,需要保证在主线程上更新UI。
  • Presenter通过接口进行交互,接口的粒度不好设计和控制,粒度太小,接口数量太多,粒度太大,解耦性下降。

在Android中使用MVP的注意事项

  • 更新UI时除了考虑是否时UI线程外,还需要考虑Activity的生命周期。
  • P层需要执行耗时操作,而P层持有Activity、Fragment的强引用,在耗时操作结束前Activity、Fragment已被摧毁了,但由于P层一直持有Activity、Fragment对象,导致Activity、Fragment无法被回收引起内存泄露;这里建议使用弱引用和Activity、Fragment的声明周期来处理;可以参考:Android中使用MVP的例子

MVVM

MVVM的结构图:


image.png

Model

Model主要是封装数据或操作的一些逻辑,还会提供一系列的实体类用于UI绑定,ViewModel则会修改这些数据后,会告诉View层并且通知UI更新。

View

View用于处理界面逻辑且不设计业务逻辑,也不涉及查询数据库,更新数据库等操作,只负责显示由Model提供的数据,相当是Activity和XML。

ViewModl

ViewModel层做的事情刚好和View层相反,VIewModel只做业务逻辑和业务数据相关的事情,不做与界面有关的事情,也不会持有UI控件的引用去更新UI。ViewModel只做与业务逻辑的事情,做的事情只是关注于数据的操作。

MVVM的优缺点

优点

低耦合,数据和业务逻辑处于一个独立的ViewModel中,ViewModel只关注数据和业务逻辑,不需要和View层打交道。
可重用性,你可以把一些试图逻辑放在一个ViewModel里面,让更多的View重用这个段试图逻辑
可独立开发,MVVM的View和View Model的耦合性低,可以一人编写View Model的逻辑,一些专注于UI。
相对于MVP而言,MVVM不需要我们处理View和ViewModel之间的大量逻辑。
由于各层分工明确,极便于单元测试。

缺点

数据绑定的bug难于被调试,你看到界面异常了,有可能是View出错,也有可能是ViewModel的业务逻辑有问题,也有可能是Model的数据出错。
对于过大的项目,数据绑定需要花费更多的内存,而对于简单的项目,使用MVVM无异是大材小用。

参考链接:
https://www.jianshu.com/p/57bbb37c63f6
https://www.jianshu.com/p/2c4919302f81

相关文章

网友评论

      本文标题:MVC MVP MVVM的学习总结

      本文链接:https://www.haomeiwen.com/subject/dcitrktx.html