对于软件架构的思考

1.什么是MVVM?

MVVM全称是Model View ViewModel,Model即数据模型,View指的是Activity或者Fragment,和MVP架构中的数据层、界面层意义是一样的。这里新增的ViewModel,是用来代替Presenter,和底层业务逻辑交互,并持有数据,内部通过LiveData去关联界面View和数据Model。

2.为什么不太推荐使用MVP

MVP架构最大的问题是View和Presenter新增接口太多,同时还需要去手动管理View的生命周期。业务简单还好,接口不会很多。一旦业务量复杂的情况下,使用MVP方式就会很痛苦。
但是用MVVM就可以很好解决这些问题。首先ViewModel和View层之间是不需要接口的,View层通过对特定LiveData数据的观察,就可以把逻辑处理好的数据更新到界面上。同时ViewModel对Activity或者Fragment的生命周期是有感知的,可以很好地管理数据的收发。
可以理解为MVVM架构是一个改进版的MVP架构。

3.MVVM可以不使用dataBinding吗?

MVVM并不等同于DataBinding,只不过二者总是混合在一起使用,导致很多人以为DataBinding就是MVVM。DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个工具。
我们在架构MVVM模式,特别是业务复杂切追求稳定性的企业级软件的时候,个人并推荐使用DataBinding。因为DataDinding有个最大的问题是,它的调试比较麻烦,一旦出现问题,可能会显得束手无策,不可控。

4.稳健的软件架构模式

通常是View(Activity/Fragment)-> ViewModel -> Repository ->NetWork/DataBase/三方SDK接口
这里的ViewModel是负责持有数据,而Repository则是提供获取数据和数据加工处理。关联方式如下:
首先定义ViewModel的构造函数:

class HeFengViewModel(private val repository: HefengRepository) : ViewModel() {......
}

然后重写Viewmodel的工厂方法,通过工厂方法把Repository参数传进去:

class HeFengModelFactory(val repository : HefengRepository) : ViewModelProvider.NewInstanceFactory() {override fun <T : ViewModel?> create(modelClass: Class<T>): T {return HeFengViewModel(repository) as T}
}

然后再通过ViewModelProviders获取到ViewModel:

object InjectorUtil {fun getHeFengModelFactory() = HeFengModelFactory(getHeFengRepository())
}class HefengActivity : AppCompatActivity() {val viewModel by lazy { ViewModelProviders.of(this, InjectorUtil.getHeFengModelFactory()).get(HeFengViewModel::class.java) }}

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

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

相关文章

论文阅读笔记AI篇 —— Transformer模型理论+实战 (一)

资源地址Attention is all you need.pdf(0积分) - CSDN 第一遍阅读&#xff08;Abstract Introduction Conclusion&#xff09; Abstract中强调Transformer摒弃了循环和卷积网络结构&#xff0c;在English-to-German翻译任务中&#xff0c;BLEU得分为28.4&#xff0c; 在En…

Python学习之路-模块和包

Python学习之路-模块和包 模块 简介 模块是 Python 程序架构的一个核心概念。每一个以扩展名 py 结尾的 Python 源代码文件都是一个模块&#xff0c;模块名同样也是一个标识符&#xff0c;需要符合标识符的命名规则。在模块中定义的全局变量、函数、类都是提供给外界直接使用…

Notepad++编译运行C/C++程序

首先需要先下载一个C语言编译器-MinGW&#xff08;免费的&#xff09; 官网&#xff1a;http://www.mingw.org/&#xff08;加载太慢&#xff09; 我选择MinGW - Minimalist GNU for Windows download | SourceForge.net这个网址下载的 注意安装地址&#xff0c;后续配置环境…

什么是Java泛型?泛型在Java中应用场景

目录 一、什么是Java泛型 二、泛型类 三、泛型接口 四、泛型方法 一、什么是Java泛型 Java泛型是一种在编译时进行类型检查和类型安全的机制。它允许编写能够操作多种类型的代码&#xff0c;而不需要进行类型转换或使用Object类型。通过在定义类、接口或方法时使用泛型参数…

云原生微服务之分布式锁框架 Redisson

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

数据仓库(3)-模型建设

本文从以下9个内容&#xff0c;介绍数据参考模型建设相关内容。 1、OLTP VS OLAP OLTP&#xff1a;全称OnLine Transaction Processing&#xff0c;中文名联机事务处理系统&#xff0c;主要是执行基本日常的事务处理&#xff0c;比如数据库记录的增删查改,例如mysql、oracle…

java大数据hadoop2.92 Java连接操作

1、要想Java可以连接自己虚拟机的hadoop文件系统&#xff0c;需要给文件系统权限 &#xff08;1&#xff09;需要在/usr/local/hadoop/etc/hadoop/core-site.xml core-site.xml文件配置具体ip <configuration><property><name>fs.defaultFS</name>&…

和MATLAB相关的设置断点的快捷键

一个朋友在修改错误的时候&#xff0c;有个操作震惊到我了。 他把迭代次数从1000减小到100&#xff0c;就可以快速仿真完。 废话不多说&#xff0c;直接上快捷键。 F12&#xff1a;设置或者清楚断点。 F5&#xff1a;运行 F10和F11都是步进&#xff0c;但是两者有区别。 …

采样次数与频率的关系

采样次数&#xff08;Sampling Points&#xff09; 在给定时间内记录信号值的次数。 假设在1秒内对一个连续信号采样10次&#xff0c;这意味着每0.1秒记录一次信号值。 假设在1秒内对一个连续信号采样100次&#xff0c;这意味着每0.01秒记录一次信号值。 频率&#xff08;Fre…

统一存储双控NAS同步备份应用方案

随着业务量的增加&#xff0c;企业必须找到一种有效的解决方案保护数据安全&#xff0c;防止不可预测的存储系统故障。传统的数据备份往往是专用的数据格式&#xff0c;不能保留完整的用户目录信息。因此&#xff0c;IT 人员必须在数据恢复后重新配置才可重新恢复业务。为了解决…

序章 初始篇—转生到vue世界!

Vue.js 是什么&#xff1f; Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…

浅谈MySQL之新增列

一、基本语法 在MySQL中&#xff0c;ALTER命令用于修改数据库表的结构&#xff0c;可以进行多种操作。 要在已有的MySQL表中新增一列&#xff0c;可以使用ALTER TABLE语句。 下面是一个基本的语法示例&#xff1a; ALTER TABLE table_name ADD COLUMN new_column_name data…

linux命令太多记不住吗?怎么办 ?于是推出了这样一套教程。

1.帮助命令 1.1 help命令 #语法格式&#xff1a; 命令 --help #作用: 查看某个命令的帮助信息 # 示例: # ls --help 查看ls命令的帮助信息# netstat --help 查看netstat命令的帮助信息1.2 man命令 #语法格式&#xff1a; man 命令 #作用: 查看某个命令的帮助手册 # 示例: …

递归(Recursion)

一、递归 递归&#xff1a;通过函数体来进行的循环 汇编&#xff1a;它没有所谓的循环嵌套这一说&#xff0c;你之前有一段指令写在什么地方&#xff0c;你不断的跳到之前的指令的地方去执行那条指令&#xff0c;这就是递归。 从前有个山山里有个庙庙里有个和尚讲故事返回1 …

智慧公厕!高科技手段提升城市品质与形象

近年来&#xff0c;随着科技的不断进步&#xff0c;智慧公厕正以其独特的功能和对公共厕所全方位的信息化和数字化&#xff0c;成为智慧城市建设中的重要一环&#xff0c;悄然崭露头角。如广州中期科技有限公司自主研发的智慧公厕管理系统&#xff0c;借助于厕位监测、环境监测…

What is `@RequestMapping` does?

在SpringMVC框架中&#xff0c;RequestMapping 用于映射HTTP请求到控制器类或控制器类中方法。 这个注解可以应用在类级别或方法级别上。 使用样例 包含路径变量和HTTP方法&#xff1a; Controller RequestMapping("/api/v1") public class MyApiController {Get…

【TensorRT】DeviceToHost同步与异步拷贝的区别及带来的问题

cudaMemcpy与cudaMemcpyAsync的区别与问题 cudaMemcpy与cudaMemcpyAsync的区别一、认识stream流二、tensorRT推理的常规流程三、遇到的问题四、引用与参考文献 cudaMemcpy与cudaMemcpyAsync的区别 一、认识stream流 在cuda中&#xff0c;一个stream是由主机代码发布的一系列在…

数据结构期末复习(C语言版)

一、绪论 1.数据结构的术语 数据&#xff1a;所有能输入计算机并被计算机程序处理的符号的总称&#xff1b;数据元素&#xff1a;数据的基本单位&#xff1b;数据项&#xff1a;组成数据元素的、有独立含义的、不可分割的最小单位&#xff1b;数据对象&#xff1a;是性质相同…

免费chartGPT网站汇总

https://s.suolj.com - &#xff08;支持文心、科大讯飞、智谱等国内大语言模型&#xff0c;Midjourney绘画、语音对讲、聊天插件&#xff09;国内可以直连&#xff0c;响应速度很快 很稳定 https://seboai.github.io - 国内可以直连&#xff0c;响应速度很快 很稳定 http://gp…

kotlin的泛型浅析

在Kotlin中&#xff0c;泛型是一种强大的编程概念&#xff0c;它允许你编写更加灵活和可重用的代码&#xff0c;同时提高类型安全性。Kotlin的泛型系统与Java的相似&#xff0c;但有一些更强大的特性。以下是关于Kotlin泛型的一些重要概念和用法&#xff1a; 1. 基本概念&…