MVC架构、MVP架构、MVVM架构

一、MVC架构

1、MVC定义

Model、View、Controller  :模型、视图、控制器的缩写,是一个软件的设计典范,它是用一种业务逻辑、数据、界面显示分离的方法组织代码,然后可以将业务逻辑聚集到一个部件里面。

在Android的开发框架中,曾经采用的是MVC的框架模式,采用MVC模式的一个好处就是便于ui界面的显示核业务逻辑的分离。

具体来说:

M Modle层用来用户逻辑的处理,比如会进行一些数据库的操作、网络的操作、一些复杂操作、一些耗时操作都会在modle层进行处理。

V view层主要是用来处理用户显示的部分,MVC框架中,xml布局就可以视为view层

C controller层 activity处理用户交互问题,因此可以认为activity就是控制器。Activity通过读取view层的数据,然后把数据交给界面来进行显示,这就是mvc的定义


M:业务逻辑处理

V:处理数据显示的部分

C:Activity处理用户交互问题


2、mvc的特点(优点)


①耦合性低

使各个层之间可以很好地分离

②可扩展性好

当扩展代码的时候就不用太多地修改代码,降低bug和crash的出现率

③模块职责划分明确


3、mvc的缺点

功能很强大,但是有很多缺点。mvc的v view层对应的是Android中的布局文件,而布局文件是由xml文件来写的,但是这个xml并不像java web端那么强大,能做的事情其实非常有限。而controller所对应的activity这个类,不仅要处理业务逻辑,而且要处理操作ui的功能。实际开发中,很多业务逻辑都写在了activity这个类里面,但是这些很多都应该是视图view层所应该做的事情,这样就导致了controller这个层非常非常的冗余和厚重,为了改进这一点,我们引入了mvp的架构模式。


4、实例





二、MVP架构

1、MVP定义

M:依然是业务逻辑和实体模型

V:对应于Activity,负责View的绘制以及与用户的交互

P:负责完成View与Model间的交互,这是与MVC最大的不同

p presenter将activity视为view视图层,而p负责activity和model层之间的数据交互,

MVP的设计模式之所以会有这么大的优势,绝对不仅仅是MVC到MVP名字上的转变,它更是把Activity这个类的业务逻辑抽出来,将一些复杂的代码抽到presenter当中来进行处理,这样的好处就是MVC比MVP的耦合性更低。

2、上面的MVP与下面的MVC最大的不同在于view是不会和model层进行交互的,是通过presenter层进行交互的

MVC中视图View层是可以和model层直接进行交互的

这就是两者最大的不同


3、代码示例

①bean:model层

presenter:处理view和model之间的业务逻辑

view:activity,view层,用于数据的显示


②bean层的User类


③biz层的类

UserBiz类


类IUserLoginView


④view层的Activity类实现了刚才所定义的方法,并实现了接口中的方法



⑤presenter中的类

数据和视图中的桥梁。

方法非常简单,但



mvp不允许view和model层之间进行交互,而mvc可以,mvc不仅会引起性能的消耗,而且会引起activity的厚重,业务逻辑非常的复杂。


三、MVVM架构


在该模式中,主要是一个view和一个view匹配,它没有mvp中的接口,它是完全和view绑定的,viewmodel层可和model双向进行交互。也就是说当view发生改变的时候,会自动更新到viewmodel这个视图上,同时,viewmodel的任何显示也会同步地显示到view视图上来。这就是一个简单的mvvm设计模式


View:对应的是activity和xml,负责view的绘制及与用户进行交互

Model:实体模型,对应的是数据模型。

ViewModel:主要负责View层和Model层的数据交互,它负责一些主要的业务逻辑。



MVVM与MVP是类似的,主要是利用数据绑定和依赖来打造一个更高效的架构。

①我们在activity与fragment的xml中写我们view层的代码,而view层其实是不做和业务相关的操作的,也就是说在activity中不写业务逻辑和与业务相关的代码,这与在mvc层是完全不一样的。mvc的c controller也就是activity写满了与业务相关的代码,通过activity来进行相应的业务操作。而mvvm绝不是这样,在activity中不能写任何与业务逻辑有关的任何代码。更新ui是通过数据绑定来实现的,是尽量要在viwmodel层来做的。就是说我们把activity的业务逻辑移动到了viewmodel层当中。而activity所要做的事就很简单了,主要做一些初始化控件,比如控件的颜色、属性之类的设置,而view层提供更新ui的接口,但是不建议所有的ui接口都通过数据绑定来更新ui。view层还可以做一些处理事件等等,比如说绑定事件、点击事件等等。简单来说,view层实际上是对应activity和xml布局文件的,它负责view的绘制、和用户交互,但是view层不能做任何业务逻辑,不能涉及数据操作,不处理数据。ui和数据显示必须分开,所以最重要的一点是,view中不能做任何与业务逻辑有关的操作。这就是view层。

②实体模型就是数据模型比如bean等等。它和我们平常定义的model层其实是不一样的,这个model层的数据存储、获取、变化。包括bean、retrofit service。model层提供的数据、获取的接口,主要提供给viewmodel层来调用,经过数据转换和操作,并最终把我们所要展示的数据显示到view层上。

③viewmodel层与view层做的完全相反,只能做与业务逻辑和操作相关的事情,但是不能做与ui相关的事情。viewmodel层和view层是通过bind绑定来实现的。