android mvc mvp 简书,浅析 MVP,MVC,MVVM模式(Android)

前言

当我们接手一个项目的时候,经常会发现一个activity或fragment动辄上千行甚至上万行代码,这给阅读带来很大的困扰,如果想读懂代码,需要花费很多时间跟精力。引起这个问题的原因想必大家都了解,随着人员不断变动,需求不断增多,在没有严格代码规范的前提下,每个人都是根据自己的偏好把需求做完,最后是代码越堆越多,维护性越来越差。为什么大家都喜欢往activity里面堆代码呢?究其原因,是因为android里面xml视图功能太弱,activity不仅要承担视图显示,还要加入控制逻辑,承担太多职责,代码就会越堆越多。

在MVC之前,有些人会考虑把activity的控制逻辑抽成Manager,但是也没有一致的规范标准,只是让代码看着清爽了些,并没有从本质上把问题解决掉,也就是View层跟controller层并未解耦。为了解决这个问题,MVP出现了,虽然可以代替activity处理大部分控制逻辑,但是MVP也存在瑕疵,代码量变大,接口变多等,因为Presenter要持有view的引用,感觉两者并未完全解耦。此时MVVM出现了,好像就是为了完善MVP的不足而设计的,在这种模式下,viewmodle跟view之间的交互是通过Data Binding来完成的,Data Binding可以实现双向的交互,这就使得视图跟控制层之间的耦合度进一步降低。

一. MVC

17d77a77af46?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Model-View-Controller.png

MVC全称Model View Controller,如上图,是模型(model)-视图(view)-控制器(controller)的缩写,用一种业务逻辑、数据、界面显示分离的方法组织代码。

其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。

Android中界面部分也采用了当前比较流行的MVC框架,在Android中:

视图层(View)

一般采用XML文件进行界面的描述,这些XML可以理解为AndroidApp的View。使用的时候可以非常方便的引入。同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。

控制层(Controller)

Android的控制层的重任通常落在了众多的Activity的肩上。这句话也就暗含了不要在Activity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

模型层(Model)

我们针对业务模型,建立的数据结构和相关的类,就可以理解为AndroidApp的Model,Model是与View无关,而与业务相关的。对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。

一. MVP

17d77a77af46?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Model-View-Presenter.png

MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。在MVP模式里通常包含3个要素(加上View interface是4个):

View

负责绘制UI元素、与用户进行交互(在Android中体现为Activity)

Model

负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)

Presenter

作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

因此我们可以发现MVP的优点如下:

1、模型与视图完全分离,我们可以修改视图而不影响模型;

2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;

3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;

4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

一. MVVM

17d77a77af46?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Model-View-ViewModel.png

View

View层做的就是和UI相关的工作,我们只在XML和Activity或Fragment写View层的代码,View层不做和业务相关的事,也就是我们的Activity 不写和业务逻辑相关代码,也不写需要根据业务逻辑来更新UI的代码,因为更新UI通过Binding实现,更新UI在ViewModel里面做(更新绑定的数据源即可),Activity 要做的事就是初始化一些控件(如控件的颜色,添加 RecyclerView 的分割线),Activity可以更新UI,但是更新的UI必须和业务逻辑和数据是没有关系的,只是单纯的根据点击或者滑动等事件更新UI(如 根据滑动颜色渐变、根据点击隐藏等单纯UI逻辑),Activity(View层)是可以处理UI事件,但是处理的只是处理UI自己的事情,View层只处理View层的事。简单的说:View层不做任何业务逻辑、不涉及操作数据、不处理数据、UI和数据严格的分开。

ViewModel

ViewModel层做的事情刚好和View层相反,ViewModel 只做和业务逻辑和业务数据相关的事,不做任何和UI、控件相关的事,ViewModel 层不会持有任何控件的引用,更不会在ViewModel中通过UI控件的引用去做更新UI的事情。ViewModel就是专注于业务的逻辑处理,操作的也都是对数据进行操作,这些个数据源绑定在相应的控件上会自动去更改UI,开发者不需要关心更新UI的事情。关于对UI控件事件的处理,我们也希望能把这些事件处理绑定到控件上,并把这些事件统一化,方便ViewModel对事件的处理和代码的美观。为此我们通过BindingAdapter 对一些常用的事件做了封装,把一个个事件封装成一个个Command,对于每个事件我们用一个ReplyCommand去处理就行了,ReplyCommand会把可能你需要的数据带给你,这使得我们处理事件的时候也只关心处理数据就行了,再强调一遍ViewModel 不做和UI相关的事。

Model

Model 的职责很简单,基本就是实体模型(Bean)同时包括Retrofit 的Service ,ViewModel 可以根据Model 获取一个Bean的Observable( RxJava ),然后做一些数据转换操作和映射到ViewModel 中的一些字段,最后把这些字段绑定到View层上。 上面三部分的分工很明确,要不要把一部分逻辑放到activity 或者fragment来做是取决于你的提到的操作逻辑是什么,如果这些逻辑操作是可以通过修改数据(这些数据绑定到UI)来更改UI或者你的操作逻辑是业务逻辑或者修改数据,那么这块逻辑你完全可以在ViewModel 里面做。如果这些逻辑操作只是和UI有关,而且不能通过Binding的方式更改数据源去反馈到UI(比如说 简单的对话框、PopupWindow等)是可以考虑放到View层去做,但是如果这部分操作逻辑涉及到业务和数据相关的,那么建议不用放到View层做,View层主要职责是和UI相关的、没有数据,没有业务。

PS:该文章仅供自己学习之用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java。为了加入到Java这一高薪行业,很多人会选择专业学习一下&#x…

最全知识点总结!| 大数据学习路线指南

全世界只有3.14 % 的人关注了数据与算法之美大数据是对海量数据进行存储、计算、统计、分析处理的一系列处理手段,处理的数据量通常是TB级,甚至是PB或EB级的数据,这是传统数据处理手段所无法完成的,其涉及的技术有分布式计算、高并…

数组 边界 检查的几种实现方法

检查传递给函数的数组边界常用方法1.传递指向数组第一个和最后一个元素的下一个位置的指针。2. 将第二个形参定义为表示数组的大小3.数组本身放置一个检测位三种实现方法&#xff1a;#include<iostream> using namespace std; int sumArray(const int *beg,const int *e…

欢迎来到开源的世界!

✉️ 请查收您的保姆级开源百科编程导航 致力于推荐优质编程资源 ????项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️大家好&#xff0c;我是鱼二&#xff0c;今天推荐一份开源知识入门的在线电子书《开源指北》。正如官方对这本书的描述&…

html图片宽度高度等比例绽放,css图片自动绽放大小,左右,上下居中

无标题页.pic{max-height:400px;max-width:400px;_width:expression("400px");_height:expression((document.documentElement.clientHeight||document.body.clientHeight)>400?"400px":"");/*_width:expression((document.documentElement.…

归纳推理测试没做完_朋友买了1斤紫菜,2年还没吃完,我教他这样做,2个月就吃完了...

朋友买了1斤紫菜&#xff0c;2年还没吃完&#xff0c;我教他这样做&#xff0c;2个月就吃完了紫菜成熟啦&#xff0c;这段时间回老家&#xff0c;都会看到紫菜养殖户脸上挂着笑容&#xff0c;因为今年的紫菜收成还不错。回家就为了拿紫菜&#xff0c;因为紫菜成熟的季节&#x…

机器学习都需要有哪些数学知识?

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。机器学习是一个异常丰富的研究领域&#xff0c;有大量未解决的问题&#xff1a;公正、可解释性、易用性。如同所有的学科一样&#xff0c;它的基本思想不是请求式的过程&#xff0c;而是需要耐心地用高级数学框架思考…

(转)64bit上安装32位oracle 10 g出现错误:无法定位承诺工序输入点 getprocessimagifilenamew 于动态链接库PSAPI.DLL...

转自http://jonelove00.iteye.com/blog/1685206安装时以最高管理员身份运行&#xff1a;红色字体为自己加上去的代码找到..\database\stage\prereq\db\refhost.xml打开加入<OPERATING_SYSTEM> <VERSION VALUE"6.1"/></OPERATING_SYSTEM> 再找…

10kv电压互感器型号_电压互感器型号大全

电压互感器简介电压互感器(Potentialtransformer简称PT&#xff0c;Voltagetransformer也简称VT)和变压器类似&#xff0c;是用来变换线路上的电压的仪器。但是变压器变换电压的目的是为了输送电能&#xff0c;因此容量很大&#xff0c;一般都是以千伏安或兆伏安为计算单位&…

C# 常用接口学习 IEnumerableT

我们先去看看公开的.Net4.0的源程序中IEnumerable<T>、IEnumerable、IEnumerator<T>和IEnumerator这四个接口是如何声明的&#xff1a;需加微信交流群的&#xff0c;请加小编微信号zls20210502&#xff0c;切记备注 加群&#xff0c;小编将会第一时间邀请你进群&am…

html5伸缩效果,【HTML5】Jquery打造竖向伸缩/展开菜单

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼效果图如下&#xff1a;jquery打造竖向伸缩/展开菜单body { font-family: Arial; font-size: 16px; }dl { width: 300px; }dl,dd { margin: 0; }dt { background-color:#ae8758; background-image:url(/jscss/demoimg/201207.png);…

labelme 语义分割数据集_labelme安装以及使用教程——自制语义分割数据集(保姆级示范)...

前言&#xff1a;这次我们要做的是一个物堆(也可以是沙、矿堆之类)的数据集&#xff0c;用于语义分割。我们的工作&#xff0c;就是要使用labelme工具&#xff0c;利用原图1.jpg生成它的标签图片1.png&#xff0c;得到的最终结果像下面这样&#xff1a;1. 安装 Anaconda3具体安…

看过这么多爆文,依旧走不好异步编程这条路?​

点击蓝字关注我们本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext。引言 C#异步编程语法糖async/await&#xff0c;使开发者很容易就能编写异步代码。零散看过很多文章&#xff0c;很多是填鸭式灌输 (有的翻译文还有偏差)。遵守以上冷冰冰的②③条的…

用html制作篮球网页,篮球网站的设计与实现).doc

篮球网站的设计与实现)篮球网站的设计与实现摘要关键词AbstractBasketball net is an introductory history of basketball, basketball to promote the development and understanding of the status quo of modern basketball, the website with news, pictures, mainly. Inc…

Android获取设备已安装的应用

2019独角兽企业重金招聘Python工程师标准>>> 项目中&#xff0c; 我们经常要用到显示系统已安装的应用&#xff0c; 可以通过两种方式获取已安装的应用&#xff0c; 一种是通过ApplicationInfo, 一种是通过ResolveInfo. 这里用的是ResolveInfo, 上代码。 <!-- la…

html按钮圆弧样式,几款不错的按钮样式汇总

几款不错的按钮样式汇总在网页设计中按钮一般默认的都比较“丑”&#xff0c;能不能通过一些好的样式来设计呢&#xff0c;下面提供几款不错的按钮样式&#xff0c;希望对大家有所帮助。一、带图标的按钮按钮样式截图按钮样式代码如下&#xff1a;/* CSS Document *//* BUTTONS…

如何讲页面打入jar包中_如何把我的Java程序变成exe文件?

JAVA是一种“跨平台”的语言&#xff0c;拥有“一次编写&#xff0c;处处运行”的特点&#xff0c;让它成为当今IT行业&#xff0c;必不可少的一门编程语言。每一个软件开发完成之后&#xff0c;应该大家都需要打包程序并发送给客户&#xff0c;常见的方式&#xff1a;java程序…

Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

&#xfeff;1622219047536写在前面Api网关我们之前是用 .netcore写的 Ocelot的&#xff0c;使用后并没有完全达到我们的预期&#xff0c;花了些时间了解后觉得kong可能是个更合适的选择。简单说下kong对比ocelot打动我的&#xff1a;1、kong可以直接代替Nginx/OpenRestry做前端…

view 背景透明

引用&#xff1a;http://www.eoeandroid.com/thread-37112-1-1.html surfaceView.setZOrderOnTop(true);surfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);win.setBackgroundColor(255);

女生学高铁和计算机哪个更好,2020铁路最好的5个专业 女生上铁路学什么专业好...

铁路专业一直是比较受欢迎的&#xff0c;有些同学都想学习铁路专业&#xff0c;应为一旦找到和铁路相关的工作&#xff0c;工资待遇都是非常好的&#xff0c;但是铁路里面也不是所有的专业都非常好&#xff0c;那么铁路里面最好的专业有哪些呢&#xff1f;女生适合学习铁路的哪…