个人总结:MVC和MVP的区别

2024-06-04 16:48
文章标签 总结 区别 mvc 个人 mvp

本文主要是介绍个人总结:MVC和MVP的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

各位老铁,历时20天我又回来了。时间嗖嗖就到年底了,才发现自己年初的计划还没开始,所以这一段时间都在专心研究后端的技术。刚开始接触MVC和MVP的时候,一直都有一个疑问,他俩到底有什么区别呢,面试的时候也经常被问到这个问题。我们都知道后端主要使用MVC,因为平台的特殊性,Android根据MVC模式演变出MVP模式,广泛的使用在开发中。

现在让我们怎么思考一下,为什么在Android平台演变出MVP模式?

本文参考了以下两篇博客,大家可以去阅读原文:

两张图看懂Android开发中MVC与MVP的区别 

MVP与MVC的异同

正文

首先看一下MVC和MVP的对比图(我直接偷来的):

通过对比图我们分析一下两种模式的特点:

MVC

View:布局的xml文件,或者纯Java写的布局,可以把页面显示的逻辑直接放在View中。

Model:数据处理层,可以直接和View进行交互。

Controller:把特定的功能逻辑抽离出来,作为控制层,保证View层和Model层的功能单一性,便于维护。

MVC模式相对比较简单,尤其是View层,我们可以通过jsp等技术直接操作页面,完成和Controlller层和Model层的交互,所以MVC的核心是在View层。

接下来我们再看看MVP模式:

MVP

View:Activity作为显示层。

Presenter:逻辑层,从Activity中抽离出功能逻辑,简化Activity的代码。

Model:数据处理层,主要负责网络请求,本地数据加载等操作,进一步简化Activity的代码。

从MVP的构成来看,Presenter和Model都是为了View层存在的,所以MVP的核心仍然是View层。

MVP的演变

刚才我们分析了MVC和MVP的构成,我们发现MVP模式相比MVC模式要复杂:

MVC的View层和Model层本身就是分离的,Controller层主要是简化View层的逻辑代码。

MVP的Presenter层和Model层都是为了拆分View层而存在的。

Activity在Android开发中扮演者重要的角色,页面显示,数据加载,各种事件,他一个人可以承担所有相关的功能。虽然通过xml方便了布局的开发,但是在与后端开发中的xml相比,他并没有承担起显示UI的责任,所以Activity变得越来越庞大,轻轻松松就可以几千行代码,非常不利于维护,为了让View层单纯的负责UI的显示,把Activity中的功能逻辑抽离出来,命名为Presenter层,把数据相关的操作(接口,本地数据库等)提取成Model层,并且直接把View层和Model层通过Presenter层解耦,进一步简化Activity的代码,防止Activity体积过大。

MVC和MVP的区别

这里主要说他们的不同点:

1、Presenter与Controller都扮演了逻辑层的角色,但是Presenter层的功能相对更复杂,因为他负责和View的双向交互,Controller只是单向的中介。因为Presenter是从View层抽离出来的,通常和View是一对一的关系,而Controller是面向业务的,往往是单例模式或者提供静态方法。

2、MVP中View和Model是不能进行通信的,虽然加重了P层的负担,但是有利于维护View层和Model层,如果条件允许,我们还可以对Presenter进一步拆分,来弥补Presenter负担过重的问题。

3、MVC中View和Model层可以直接交互,虽然方便了两者之间的交互,但是耦合性相对较高。

其他的不同点就不说了,本来两种模式的出发点就不同,不同点那肯定导出都是,细说这些其实没有什么太大意义。

总结

“Android为什么没有使用MVC,而是使用MVP?"

如果还有人再问我这样的问题,我就可以轻松的说出我自己的见解,而不是毫无底气的猜测。

没有最好的架构模式。随着业务的不断增长,为了让我们的代码变得更美观,我们可能会多种模式混合使用,再或者在原本的模式上衍生出新的模式,这就是架构的魅力。看来我这20几天还是没白学的。

马上要十一了,最后祝大家国庆愉快~

 

 

这篇关于个人总结:MVC和MVP的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030562

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-