MVC、MVP和MVVM原理和比较
2018-05-04 本文已影响0人
海重山青
MVC模式原理
MVC
,即Model-View-Controller
,意味:模型、视图和控制器。
-
Model
- 程序需要操作的数据来源。通常是从数据库、网络请求或者是
Bean
数据。 - 负责提供数据
- 程序需要操作的数据来源。通常是从数据库、网络请求或者是
-
View
- 程序用来展示内容的界面。通常是
Activity
、Fragment
等UI
组件。 - 负责展示数据
- 程序用来展示内容的界面。通常是
-
Controller
- 程序中用于处理
Model
数据业务逻辑并将结果输送给View
的中间层。 - 负责处理业务逻辑
- 程序中用于处理
实际开发中
Activity
究竟算Controller
还是View
说不清楚。理论上Activity
是UI
组件负责展示内容,但很多项目中Activity
处理了太多的业务逻辑操作。超过1000
行代码太常见了。根据这种情况我将Activity
放到Controller
上。只是个人习惯而已!
优缺点
- 优点
- 耦合性低:视图层和业务层分离。
- 重用性高:多个
View
能共享同一个Model
。 - 部署快:责任分离,各司其职,职责清晰。
- 可维护性高
- 缺点
-
Controller
角色比重太大。虽然担任控制器的职责,但现实开发中类似Activity
的UI
却做了很多View
相关操作。VC
分离不清。 - 优点中的耦合性低是相对的,现实中
MVC
的耦合性确实不低!
-
MVP模式原理
知道了MVC
的不足之处,MVP
就是为了解决VC
耦合这个问题,在MVC
的基础上变种出来的框架。
M
几乎没有变化,只是把VC
抽出来变成了VP
。
MVP
核心思想:
MVP
把Activity
中的UI
逻辑抽象成View
接口,把业务逻辑抽象成Presenter
接口,Model
类还是原来的Model
。
减轻了Activity
的工作,因为大部分工作都丢到了Presenter
那去了。自己只要管理好生命周期即可。
根据上图,代码所需的实现:
- 创建
IPresenter
表示业务逻辑接口,由PresenterImpl
实现 - 创建
IView
接口表示UI
逻辑实现,由Activity
、Fragment
等UI
组件实现 -
Activity
关联PresenterImpl
用于调用业务方法 -
PresenterImpl
关联Activity
用于调用UI
方法 -
Model
木有变化,还是原来的Model
~♪(∇*)
优缺点
- 优点
- 结构清晰,比
MVC
要清晰多了
- 结构清晰,比
- 缺点
- 每个
View
都有个Presenter
,多了也是个麻烦~
- 每个
MVVM模式原理
MVVM
模式利用了一个工具DataBinding
实现了其中的VM
。将数据和View
绑定在一起,这样一来,数据发生改变,View
会即时更新。
-
Model
-
Model
还是原来的Model
,负责提供实体模型。供VM
使用。
-
-
View
-
Activity
、Fragment
以及View
组件,这一块只包含UI
相关代码。不含有一点业务逻辑代码。 - 这才是真正的
View
模块,View
模块就应该只负责UI
逻辑。
-
-
ViewModel
- 只负责业务逻辑
- 将
Model
提供的实体数据和View
中真正展示数据的UI组件通过DataBinding
绑定在一起。 - 我们就不用像以前那样,等
Bean
改变后,get
里面的属性值。然后获取UI
组件的引用,将属性值设置到UI
组件上。 -
VM
绑定在一起,Model
一改变,View
自动实时更新!
优缺点
- 优点
-
双向绑定技术,
Model
变化,View
自动更新。或者说,Model
变化,ViewModel
和View
自动更新(角度不一样而已)。 - 模块之间职责更清晰。
- 控制器功能大都到了
View
上,大大减轻压力。
-
双向绑定技术,
- 缺点
-
DataBinding
后很难进行调试,出现问题很难进行定位。 - 大项目中
Model
会很大,长期占有不能释放会占内存。 -
View
的重用性降低,MVVM
中的一个View
绑定一个Model
。不同模块的View
都不同,重用困难。
-