模式详解: MVVM、MVC、MVP

MVVM

m:model 数据层
v:view 视图层
vm: 数据双向绑定

在这里插入图片描述

MVVM(Model-View-ViewModel)是一种软件架构设计模式,它是MVC的增强版,实质上和MVC没有本质区别,MVVM是以“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,而是通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图数据的变化会同时 修改数据源,而且数据源数据的变化也会立即反应到View上。
三者关系
在这里插入图片描述
MVVM的优点:

  1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
  4. 可测试。界面素来是比较难于测试的,测试可以针对ViewModel来写。

MVC

Model:数据模型,用来存储数据
View:视图界面,用来展示UI界面和响应用户交互
Controller:控制器(大管家角色),监听模型数据的改变和控制视图行为、处理用户交互。

MVC是比较直观的架构模式,用户操作->View(负责接收用户的输入操作)->Controller(业务逻辑处理)->Model(数据持久化)->View(将结果反馈给View)

三者关系
在这里插入图片描述
在MVC中,View是可以直接访问Model,那么View里会包含Model的信息,不可避免的也包含一些业务逻辑。在MVC模型里,更关注的Model改变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但View是依赖于Model。而对Android来说,activity基本承担来view层和controller层两种角色,并且和model层耦合严重,在逻辑复杂的界面维护起来很麻烦。那么这时候MVP出来,切断View和Model之间的关系。

MVC的优缺点

优点:

  1. 把业务逻辑全部分离到Controller中,模块化程度高。当业务逻辑变更的时候,不需要变更View和Model,只需要Controller换成另外一个Controller就行了(Swappable Controller)。
  2. 察者模式可以做到多视图同时更新。

缺点:

  1. 所有业务逻辑都在Controller里操作,逻辑复杂且不利于维护,
  2. 大量的DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。
  3. View无法组件化。View是强依赖特定的Model的,如果需要把这个View抽出来作为一个另外一个应用程序可复用的组件就困难了。因为不同程序的的Domain Model是不一样的.
  4. 当 Model 频繁发生变化,需要主动更新到View ;当用户的操作导致Model发生变化,同样需要将变化的数据同步到Model中, 这样的工作不仅繁琐,而且很难维护复杂多变的数据状态。

由于MVC模式的缺陷,MVC的变种模式衍生出MVVM模式

MVVM和MVC的区别
MVC在开发过程中,由于需求的变更或添加,项目的复杂度越来越高,代码量越来越大,此时我们会发现MVC维护起来有些吃力,首先被人吐槽的最多的就是MVC的简写变成了Massive-View-Controller(意为沉重的Controller)

扫描二维码关注公众号,回复: 17279266 查看本文章

MVC和MVVM的区别不是VM完全取代了C,ViewModel存在的目的在于抽离controller中展示的业务逻辑,用一个专门的对象去管理,而不是替代Controller,这个对象就是ViewModel,其它视图操作业务等还是应该放在controller中实现,也就是说MVVM实现的业务逻辑组件的重用。

MVP

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

Model:数据模型,用来存储数据
View:视图界面,用来展示UI界面和响应用户交互
Presenter:展示器,Presenter是从Model中获取数据并提供给View层,简单的就是当View需要去更新数据时,首先找Presenter,Presenter然后去向Model请求数据,从Model获取数据之后通知Presenter,Presenter再通知View去更新数据。简而言之:返回什么数据给View。

三者关系
在这里插入图片描述

  1. 各部分之间的通信,都是双向的。
  2. View 与 Model 不发生联系,都通过 Presenter 传递。
  3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

猜你喜欢

转载自blog.csdn.net/qq_33290233/article/details/115461365