三大架构的比较

关于Android MvvM的一些体会 关于Android MvvM的一些体会 前言 由于我司项目较老有很多历史包袱代码结构也比较混乱,需求复杂的页面动辄activity中1000多行,看着很是头疼,于是趁着加班提前做完需求余下的时间学习了mvvm对项目部分功能进行了改造,目前已经使用3个版本了,本篇博文分享下我使用的感受。 准备 这里先说说关于mvvm的几个问题(如有不对请轻喷 (╹▽╹)) 首先说说我为啥选择mvvm而不... 阅读详情


关于作者

作者:liujc

博客地址:http://www.jianshu.com/u/0633b9f8256b

声明:本文由作者授权发布,未经原作者允许请勿转载


MVC

模型层(Model)
负责存储、检索、操纵来自数据库或者网络的数据

视图层(View)
用户界面,一般采用XML文件进行界面的描述

控制层(Controller)
业务逻辑处理

1. 工作原理

  • 当用户出发事件的时候,view层会发送指令到controller层,自己不执行业务逻辑。

  • Controller执行业务逻辑并且操作Model,但不会直接操作View,可以说它是对View无知的。

  • model层更新完数据然后对视图进行更新,用户得到反馈。

2. MVC代码实例

  • 1.先实现一个 model,需要有通知View更新的能力,当model加载成功,模拟从网络或者本地获取数据,需要告知View更新:

  • 2.View
    View需要发出点击事件,并且传递Controller,同时需要根据Model更新UI:

  1. Controller :有时候我们的Activity既充当View也充当Controller, 这里为了更好的理解MVC,将Activity进行了拆解。

3. MVC调用链

  1. View:OnClick ->

  2. Controller:loadData->

  3. Model:loadModel->

  4. View:updateUI


4. MVC优缺点

  • 优点:
    把业务逻辑全部分离到Controller中,模块化程度高。当业务逻辑变更的时候,不需要变更View和Model,只需要Controller换成另外一个Controller就行了。

  • 缺点:
    1、 Controller测试困难。因为视图同步操作是由View自己执行,而View只能在有UI的环境下运行。在没有UI环境下对Controller进行单元测试的时候,Controller业务逻辑的正确性是无法验证的:Controller更新Model的时候,无法对View的更新操作进行断言。
    2、 xml作为view层,控制能力实在太弱,Activity基本上都是View和Controller的合体,既要负责视图的显示又要加入控制逻辑,承担的功能很多,导致代码量很大。如想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是controller层。
    3、 view层和model层之间存在耦合。

MVP

  • 模型层(Model)
    负责存储、检索、操纵来自数据库或者网络的数据。

  • 视图层(View)
    用户界面,一般采用XML文件进行界面的描述。

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

1. 工作原理

  1. View 接受用户请求

  2. View 传递请求给Presenter

  3. Presenter做逻辑处理,修改Model

  4. Model 通知Presenter数据变化

  5. Presenter 更新View

2. MVP代码实例

MVP中Model、View、Presenter中的联系件

还在MVC的例子上变动,需要先对Model进行封装,当loadModel后,不直接通知View更新,而是通知Presenter。

View需要发出点击事件,并且传递给Presenter ,最后也由Presenter去通知View更新UI:

Presenter ,接收到来自View的操作命令后,进行逻辑处理,处理Model,修改完成后 通知View进行修改。

3. MVP调用链

  1. View:OnClick ->

  2. Presenter:loadData->

  3. Model:loadModel->

  4. Presenter:onSuccess->

  5. View:updateUI


4. MVP优缺点

  • 优点:
    1、便于测试。Presenter对View是通过接口进行,在对Presenter进行不依赖UI环境的单元测试的时候。可以通过Mock一个View对象,这个对象只需要实现了View的接口即可。然后依赖注入到Presenter中,单元测试的时候就可以完整的测试Presenter业务逻辑的正确性。

    2、避免了传统开发模式中View和Model耦合的情况,提高了代码可扩展性、组件复用能力、团队协作的效率。

  • 缺点:
    1、 View(Activity)需要持有Presenter的引用,同时,Presenter也需要持有View(Activity)的引用,增加了控制的复杂度;

    2、MVC中Activity的代码很臃肿,转移到MVP的Presenter中,同样造成了Presenter在业务逻辑复杂时的代码臃肿。


MVVM

  • 模型层(Model)
    负责存储、检索、操纵来自数据库或者网络的数据

  • 视图层(View)
    用户界面,一般采用XML文件进行界面的描述

  • 视图-模型层(ViewModel)
    负责View和Model之间的通信,以此分离视图和数据。

1. 工作原理

  1. View 接收用户交互请求

  2. View 将请求转交给ViewModel

  3. ViewModel 操作Model数据更新

  4. Model 更新完数据,通知ViewModel数据发生变化

  5. ViewModel 更新View数据

2. MVVM代码实例

1.Model

2.ViewModel

3.接着使用databinding语法 对 xml 进行数据绑定,我们将 Click事件、输出结果都绑定到ViewModel上。

4.最后在View(Activity)中引入ViewModel :

3.MVVM优缺点

  • 优点:
    1、低耦合。View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

  • 2、可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。

  • 3、独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,生成xml代码。

  • 4、ViewModel解决MVP中View(Activity)和Presenter相互持有对方应用的问题,界面由数据进行驱动,响应界面操作无需由View(Activity)传递,数据的变化也无需Presenter调用View(Activity)实现,使得数据传递的过程更加简洁,高效。

  • 缺点:

    1、ViewModel中存在对Model的依赖。
    2、数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。
    3、IDE不够完善(修改ViewModel的名称对应的xml文件中不会自动修改等)。


Databing

DataBinding是2015年谷歌 I/O大会上介绍了一个数据绑定框架,以前我们可能需要在每个Activity里写很多的findViewById,不仅麻烦,还增加了代码的耦合性,如果我们使用DataBinding,就可以抛弃那么多的findViewById,省时省力。

双向绑定的概念让传统的布局文件由被动转为主动,数据驱动UI,而且View与ViewModel实现了完美的解耦,这也解决了MVP模式下的缺点。


总结

从MVC、MVP到MVVM,实际上是模型和视图的分离过程。MVC中模型和视图没有完全分离,造成Activity代码臃肿,MVP中通过Presenter来进行中转,模型和视图彻底分离,但由于V和P互相引用,代码不够优雅。ViewModel通过Data Binding实现了视图和数据的绑定,解决了这种MVP的缺陷。


可参考一套Android App基础框架

架构设计:从MVC、MVP到MVVM
网络访问:支持REST、HTTPS及SPDY的Retrofit+Okhttp
响应式编程:RxJava/RxAndroid解决方案
依赖注入:Dagger2和ButterKnife使用


框架的选择
任何的项目框架,都是为项目服务的。没有绝对的好坏之分,只有更合适的选择。在项目进展的不同阶段,做出最合适的调整,才是是更适合团队项目发展的框架。谨记任何的项目设计,都是要围绕项目发展阶段,团队成员规模,和团队整体能力而定的。切莫为了设计而设计,为了框架而框架。快速,高效的配合整个团队进展项目,才是最合适的架构。


推荐阅读

他们说学历不重要,可怜你深信不疑

北上广深的你,归宿在哪里?

那些拿命换钱的年轻人,生或死其实没什么所谓 

大数据领域数据架构的存储方案比较 在大数据时代,数据量呈现爆炸式增长,如何高效地存储和管理这些数据成为了关键问题。不同的数据架构存储方案各有优缺点,我们的目的就是对这些方案进行全面的比较,让大家清楚了解它们在不同场景下的适用性。本文的范围涵盖了常见的大数据存储方案,如分布式文件系统、列式数据库、对象存储等。本文首先会介绍相关的术语和概念,让大家对大数据存储有一个基本的认识。然后详细讲解核心概念,包括各种存储方案的特点和它们之间的关系。接着会阐述算法原理、数学模型,通过项目实战案例进行说明。 阅读详情

相关推荐

SA与NSA网络架构的区别

介绍5G组网方式及业务特性

四儿家的小祖宗的博客 2477

android中MVC MVP MVVM三种架构对比

mvp架构由mvc架构发展而来,p层将业务逻辑处理从activity中抽离出来,实现了view层与model层的完全解耦,但view层和presenter层还是有耦合(p层需要持有v层的引用,来更新view)。缺点:随着业务的增加Activity会变的臃肿,因为activity中既要处理业务逻辑又要更新view,不符合单一职责设计思想,耦合度高,扩展性、可重用性差。presenter层:presenter接口,及实现类,View层与Model层的桥梁并对业务逻辑进行处理。优点:分层清晰,耦合降低。

qq_27246079的博客 1287

Android MVVM介绍与理解

我的博客 https://mp.youkuaiyun.com/postedit/98481677,请查看

Android MVP架构和MVC架构比较(有代码示例)

Android MVP架构和MVC架构比较 代码示例请点击点击下载demo 1.概述 如题,本文想要讨论的是MVP与MVC之间的比较,那么在这之前,我们首先来回顾一下MVC的概念.MVC我们再熟悉不过,即Model-View-Controllor,对应于Android项目结构如下 - Model对应于业务逻辑和实体类 - View对应于xml布局

ronaldong99的专栏 3174

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5069

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8717

Android的MVVM模式优缺点

MVVM设计模式的优点 1.双向绑定技术,当Model变化时,View-Model会自动更新,View也会自动变化。很好做到数据的一致性,不用担心,在模块的这一块数据是这个值,在另一块就是另一个值了。所以 MVVM模式有些时候又被称作:model-view-binder模式。 2.View的功能进一步的强化,具有控制的部分功能,若想无限增强它的功能,甚至控制器的全部功几乎都可以迁移到各个Vie

shenbin1的博客 1万+

在 Windows 上安装 OpenCV – C++ / Python

而且,安装并不是一件容易的事。这些安装程序仅适用于安装 OpenCV for C++。如果您想安装适用于 Python 的 OpenCV,您将在博客后面找到相关信息。在这篇博文中,我们将在 Windows 上安装适用于 C++ 和 Python 的 OpenCV。C++ 安装是在自定义安装 exe 文件的帮助下完成的。而Python的安装是通过Anaconda完成的。从源代码安装 OpenCV 需要花费大量时间。根据您的硬件和安装配置,该过程可能需要 5 分钟到 2 小时不等。

Demondai999的博客 2090

Android架构模式mvc,mvp,mvvm的优缺点总结与应用中mvvm接入教程

首先谈下Android种常见的几种项目的架构模式的优缺点: 一.MVC (Model-View-Presenter):作用是数据模型与业务和展示逻辑解耦,在客户端应用开发中,就是将模型(M-数据)、视图(V-页面)之间实现代码分离,松散耦合,使之成为一个更容易开发、维护和测试的客户端应用程序。他们的调用流程是: View 传送指令到 Controller ; Controller...

迎风致万里的博客 3294

Unity XR Interaction Toolkit(二)手柄交互

XR Interaction 手柄事件和抓取设置

qq_36608844的博客 8494

状态机与RTOS的融合实践:如何避免‘状态爆炸’并提升系统响应

本文探讨了状态机与RTOS的融合实践,重点介绍了如何通过层次化状态机、表驱动设计等策略避免状态爆炸问题,并优化任务调度与事件处理机制,从而显著提升嵌入式系统的响应速度和可靠性。

net55的博客 106

Web前端三大架构 React、Angular与Vue全面比较

Angular是Google提供的一种开源的前端Web应用程序框架。通过其模型-视图-控制器(MVC)式的架构,开发人员能够轻松地进行各种开发、维护和测试。它不但适用于构建具有高活跃性和交互性的Web应用场景,还广受单页面式应用程序的欢迎。上图是最新的Angular发布周期表。由Facebook带来的React是一个开源的JavaScript库。它可以被用于构建交互式、有状态、且可重用的用户界面(UI)。而这些正是呈现具有高性能、且复杂的UI的基本功能要求。

JBIB ENGINE 1346

交通银行金融科技后端开发实习生面试经验

笔试之路的第一个脚印。不足的地方:基本功不扎实,得补。先补sql(先整理出一篇sql语句做题的文章,争取下次笔试拿下这一块),编程题中的SQL写不出来感觉很丢人。然后补八股文,结合一些网上项目教程,来理解常用的一些八股文(比如各种锁)。

T__TSZ的博客 1719

vue web 项目内存占用空间一直增长_Web前端三大架构 React、Angular与Vue全面比较

本文将和您一起探究React、Angular和Vue三种前端架构的不同优劣势,以及各自适用的使用场景。什么是Angular?Angular是Google提供的一种开源的前端Web应用程序框架。通过其模型-视图-控制器(MVC)式的架构,开发人员能够轻松地进行各种开发、维护和测试。它不但适用于构建具有高活跃性和交互性的Web应用场景,还广受单页面式应用程序的欢迎。上图是最新的Angular发布周期表...

weixin_39736606的博客 818

USB2.0协议解读

就写到这吧,其他协议层等属于软件需要了解的东西了。简单看了下,本文总结的有点乱,有两个原因吧,其一是理解的不够透彻,无法用简单明了的语言总结;其二是感觉这个协议文档章节划分的也不是很好,有点大杂烩。

qflook的博客 3673

以 Cloud 为核心的设备 mTLS 证书体系:从产品需求到 OP-TEE 安全落地

本文探讨了以云端为核心的物联网设备mTLS证书体系构建方案。文章从产品需求出发,分析了云端必须采用mTLS+证书体系管理设备身份的原因,指出静态Token方案的三大缺陷:身份不可控、运营不可控和审计不可控。重点阐述了mTLS在产品中的核心功能是加密传输和双向认证,并详细列出了云端PKI、设备注册中心等必备组件。在设备侧,强调必须通过OP-TEE技术保护私钥安全,提出了一个包含密钥生成、CSR导出等功能的TA设计方案。最后,文章给出了云端端到端流程示例,说明如何将证书生命周期管理转化为可运营的产品能力,包括自

Interview_TC的博客 639

【系统架构】三大主流软件负载均衡器(LVS、Nginx、HAproxy) 与商业SLB比较

主流软件负载均衡概要: 1、LVS:     1. 抗负载能力强,性能高,能达到F5的60%,对内存和CPU资源消耗比较低     2. 工作在网络4层,通过VRRP协议(仅作代理之用),具体的流量是由linux内核来处理,因此没有流量的产生。     3. 稳定,可靠性高,自身有完美的热备方案(Keepalived+lvs)     4. 不支持正则处理,不能做动静分离。     5. 支持...

讯开技术孵化器博客 8483

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java笔记——Java的三大体系架构:深入剖析Java的三大体系架构

Java SE 以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。Java SE 包含了支持Java Web 服务开发的类,并为Java Platform,Enterprise Edition(Java EE)提供基础。

a25847a的博客 1547

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RKE1、K3S、RKE2 三大 Kubernetes 发行版的比较

与 Rancher 1.0 的 Docker 容器管理不同,Rancher 2.0 仅支持 Kubernetes 作为唯一的编排引擎。Rancher 2.0 经过了至少三次重构,最终选择了最优的方案才发布。这三个 Kubernetes 发行版都是由 Rancher 开源的,这次分享将主要介绍它们的区别、各自的特点,以及适用的应用场景。分享人是来自 Rancher 苏州公司的工程师,主要负责 Rancher 国内社区的运营和运维工作。这个截图展示的是 Rancher UI 创建下游集群的选项,可以选择创建。

techdashen的博客 2175

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

三大主流框架React、Angular、Vue

【引言】 web前端开发 当前世界中,技术发展非常迅速并且变化迅速,开发者需要更多的开发工具来解决不同的问题。本文就对于当下主流的前端开发技术React、Vue、Angular这三个框架做个相对详尽的探究。 【React】 React(也被称为React.js或ReactJS)是一个用于构建用户界面的JavaScript库。它由Facebook和一个由个人开发者和公司组成的社区来维护。 React可以作为开发单页或移动应用的基础。然而,React只关注向DOM渲染数据,因此创建React应用通常需

lin123_00的博客 4479

异步代码中的时序侧信道防护:常时比较、缓存行填充与 speculative execution 缓解

异步运行时的高并发放大了时序差异的测量精度,侧信道防护在异步代码中更加必要常时比较通过无分支 XOR 和固定长度循环消除数据依赖的时间差异缓存行填充解决 False Sharing,消除并发访问的时序交叉干扰lfence序列化指令是防御 Spectre 类推测执行攻击的关键机制时序安全的成本应在系统设计阶段评估,通过模块化封装将防护控制在安全关键路径。

2301_81410839的博客 2862

Loki日志采集终极指南:三大客户端工具性能对比与实战部署

在云原生监控体系中,日志数据的实时采集与高效传输是确保系统可观测性的关键环节。Loki作为业界领先的日志聚合解决方案,提供了多种客户端工具选择,但面对Promtail、Alloy和Docker驱动这三种方案,技术团队往往陷入选择困境。本文将从运维实战角度出发,深度解析各工具的性能特性,并提供可落地的部署方案。 ## 运维痛点:日志采集的三大挑战 现代分布式系统在日志采集过程中普遍面临以下核心问

gitblog_01140的博客 872

ReactPy中的TypeScript工具比较:不同工具功能

ReactPy作为一个允许开发者使用Python构建React风格界面的框架,其JavaScript/TypeScript部分采用了多种工具来确保代码质量和开发效率。本文将详细比较ReactPy项目中使用的TypeScript相关工具及其功能特点。 ## 项目TypeScript配置架构 ReactPy的TypeScript配置采用了分层结构,通过扩展基础配置文件实现不同模块的定制化需求。核心...

gitblog_01116的博客 388

架构之限流

在现代分布式系统中,流量控制是保障系统稳定性的核心机制之一。当系统面临突发流量时,如果没有有效的限流策略,可能导致服务雪崩、资源耗尽、下游系统过载等严重后果。 限流法则强调:高可用系统必须具备流量控制能力,通过计数器、漏桶、令牌桶等限流算法,在系统容量边界内平滑处理请求,保护自身系统和下游系统不被巨型流量冲垮,确保核心服务的可用性。

d3y1`5 81_09 1016

react中的filble架构和diffes算法如何实现的

while (有任务 && 有空闲时间) {执行一个 Fiber👉不卡 UI 的关键React Fiber 的核心是:可中断、可恢复、可优先级调度;Diff 算法本身是启发式 O(n),Fiber 让它变得不阻塞 UI。

qq_25416827的博客 556

三大自动化测试工具:Playwright、Puppeteer、Selenium终极对比

摘要:本文对比了三大浏览器自动化工具的特点。Playwright由微软开发,支持多语言和浏览器,适合现代Web应用测试。Puppeteer专注Chromium系浏览器,适合爬虫等场景。Selenium兼容性最广但速度较慢。架构上,Playwright和Puppeteer直接通过调试协议通信,而Selenium依赖WebDriver中间层。三者各有优势:Playwright在多浏览器测试表现优异,Puppeteer轻量高效,Selenium则提供最广泛的浏览器支持。文章还提供了Python和JavaScrip

qq_34160913的博客 1458
上一篇: Java面试题集锦
下一篇: 十个不可忽视的Java基础知识
Java_2017_csdn
博客等级 码龄10年 329粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值