本文共 2216 字,大约阅读时间需要 7 分钟。
1.前言
三个框架的共同目的:为了将业务和视图的实现代码分离,从而使同一个程序可以使用不同的表现形式。
MVC = Model-View-Controller
MVP = Model-View-Presenter
MVVM = Model-View-ViewModel
都有Model和View层。Model 为模型层,主要管理业务模型的数据和行为;View 为展示层,其职责就是管理用户界面。三个架构模式目的都是为了解耦 Model 和 View,主要不同点就在于三者实现解耦的方案不同。
2.MVC
MVC = Model-View-Controller
Model = 数据 + 业务逻辑。因此,处理业务逻辑属于 Model 的职责,而非 Controller。
View 是 MVC 里最好理解的,它会接收用户的交互请求并展示数据信息给用户。一个 View 展示的数据可能只是一个 Model 对象的部分数据,也可能是一个 Model 对象的全部数据,甚至可能是多个 Model 对象数据的组合。在 MVC 里,View 被设计为可嵌套的,使用了组合(Composite)模式来实现。比如,列表视图(ListView)或表格视图(TableView)由每个 Item 组成,每个 Item 又可以由图片、文本、按钮等组成。View 是倾向于可复用的,因此,在实际应用中,倾向于将 View 开发成相对通用的组件。
Controller 层主要担任 Model 与 View 之间的桥梁,用于控制程序的流程。Controller 负责确保 View 可以访问到需要显示的 Model 对象数据,并充当 View 了解 Model 更改的渠道。View 接收到用户的交互请求之后,会将请求转发给 Controller,Controller 解析用户的请求之后,就会交给对应的 Model 去处理。因此,理论上,Controller 应该是很轻的。
这就是 MVC 最初版本的通信机制,自 1979 年提出之后就被广泛应用在 GUI 程序中。请注意,那时候还没有 HTTP。后来随着微软 ASP.NET MVC Framework 的出现,MVC 也开始被广泛应用于 Web 程序。
3.变种MVC
由于 View 依赖了 Model,实际上减低了 View 的可复用性。那么,如果能将 View 和 Model 彻底解耦,那就可以提高 View 的可复用性了。因此,出现了下面这种变种 MVC:
- 彻底结构view层和model层,view层可以复用
- Controller层职责变得很重
4.MVP
Presenter 其实就是 Controller,只是为了与 MVC 区别开来,所以才称为 Presenter。
在 MVP 里,三件套各自的职责和依赖关系和变种 MVC 里的职责和依赖关系其实是一样的,但不同的是,MVP 之间的交互主要是通过接口实现的,Model、View、Presenter 都有各自的接口,定义各自的行为方法。针对接口编程,自然就能减低耦合,提高可复用性,以及容易进行单元测试。
接着,我们来总结下 MVP 有哪些优缺点。先有看看有哪些优点呢:
- 我们知道,MVC 模式在 App 实际应用中,Activity 和 UIViewController 既同时担任 Controller 又担任部分 View 的职责,职责不清,导致 Activity 和 UIViewController 容易变得越来越臃肿。而应用 MVP 模式,直接将 Activity 和 UIViewController 划分到 View 层了,职责明确了,自然也避免了 Activity 和 UIViewController 臃肿的问题。
- MVP 之间的交互通过接口来进行的,那就便于进行单元测试了,维护性和扩展性也提高了。
- M 和 V 之间彻底分离了,降低了耦合性,修改 V 层也不会影响 M 层。
不过,相应地,相比 MVC 也引入了一些弊端:
- 由于增加了很多接口的定义,需要编写的代码量暴增,增加了项目的复杂度。
- 需要对很多业务模块之间的交互抽象成接口定义,对开发人员的设计能力要求更高了。
一个MVP的案例:
5.MVVM
MVVM 的关系图和 MVP 很相似,最大的不同在于 View 和 ViewModel 之间主要是通过数据绑定的方案来实现交互的。
与MVP不同点:数据绑定view->ViewModel
要实现数据绑定,通常都采用发布者-订阅者模式进行实现,但这部分工作如果由开发人员自己来写代码实现,其实还是挺复杂的,因此,各大平台都提供了各自的内部实现。比如 Vue 和 React 自身都实现了数据绑定,Android 目前最主流的方案就是采用 Jetpack,iOS 最常用的方案则是结合 ReactiveCocoa(RAC)实现。
6.MVP与MVVM
总结一下,MVP 和 MVVM 都是为了解决界面和数据的分离问题,两者只是采用了不同的实现方案。
MVP 之间的交互主要是通过接口实现的,其主要弊端就是需要编写大量接口。
而 MVVM 则是通过数据绑定的方式实现交互,虽然其实现需要依赖具体的一些框架工具,但明显大大减少了开发者需要编写的代码量。
本文理解内容来自下面的链接,如果需要查看详细内容,点击:
转载地址:https://kerry.blog.csdn.net/article/details/111313908 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!