Android中对MVC,MVP,MVVM架构的理解

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
👉点击跳转到教程

以下是主流的对MVC,MVP,MVVM架构理解的图示
在这里插入图片描述
一、对于MVC架构的理解:

1、首先编写Model:

class DataCenter {companion object {fun getData() = listOf("Hi", "Android")}
}

2、在MVC中,activity_m_v_c.xml对应的是视图部分,就是View层

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MVCActivity"><EditTextandroid:id="@+id/data1View"android:layout_width="match_parent"android:layout_height="wrap_content" /><EditTextandroid:id="@+id/data2View"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/save"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="save" />
</LinearLayout>

3、Controller控制器对应的就是Activity

class MVCActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_m_v_c)val data = DataCenter.getData()data1View.setText(data[0])data2View.setText(data[1])}
}

但是随着软件越来越来复杂,会发现这样的写法不是太好,有些缺陷,Controller和View越来越耦合了,Controller指挥View去显示,具体怎么显示Controller是不关注的,比如setContentView(R.layout.activity_m_v_c),和具体的摆放逻辑全部是在xml中进行摆放布局的,但是Controller层要操控具体的数据应该放在哪个控件上,随着软件越来越大,Controller和View层的关系越来越紧密,所以引入了MVP架构。

二、对于MVP架构的理解:

1、Model层对应的代码

class DataCenter {companion object {fun getData() = listOf("Hi", "Android")}
}

2、Presenter对应的代码如下

class Presenter(private val iView: IView) {fun init() {val data = DataCenter.getData()iView.showData(data)}interface IView {fun showData(data: List<String>)}
}

3、View层对应的为MVPActivity和该Activity对应的xml

class MVPActivity : AppCompatActivity(), Presenter.IView {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_m_v_c)Presenter(this).init()}override fun showData(data: List<String>) {data1View.setText(data[0])data2View.setText(data[1])}
}

在MVP架构中,Presenter通过Model拿到数据,通过View进行显示,具体怎么拿数据和怎么显示Presenter不关心,Model层完全掌握数据的读和写,View层Activity和xml完成掌握了如何显示。MVP把View部分和Presenter部分完成拆开,达到更加松散的一种效果,不再那么耦合。

三、对于MVVM架构的理解:

Android中的MVVM其实就是MVP加上数据绑定,程序中的数据可以分为三类:外部数据(数据库数据,文件数据和网络数据),内存数据(Java中的一些变量),表现数据(界面展示的数据)。
数据双向绑定:表现数据和内存数据,自动实现双向更新。比如一个EditText输入框,输入不同的文本,表现数据变化了,内存数据也自动更新,或者内存数据变化了,输入框中的文本也发生了变化这就是双向绑定。

还有就是界面数据改变了,会改变内存数据,内存数据改变了会改变数据库中的数据,反过来,数据库中的数据改变了,内存数据会发生改变,内存数据改变了会导致表现数据发生改变,界面发生变化。这种三层的数据改变也是属于MVVM,但是通常MVVM中的数据绑定是内存数据,和表现数据之间的联动。

MVP架构加上DataBinding就是MVVM,MVC和MVP架构性质更强,提供的是一种规范和一种规则,而MVVM是一种框架而不是架构,框架更像是一个库,用这个库就可以用来开发了,不用遵守规则,你用这个库就自动遵守了规则。而MVVM更像一种框架,双向绑定是一种工具,一个库,因为自己实现起来比较复杂,需要用其框架和库比如Android中谷歌推出的DataBinding。

下面实现一个简单的MVVM框架,并自己实现双向绑定。

1.Model层对应的代码如下

class DataCenter {companion object {fun getData() = listOf("Hi", "Android")}
}

2.View层为MvvmActivity和对应的xml

class MvvmActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_m_v_c)ViewModel(data1View, data2View).init()val data = DataCenter.getData()data1View.setText(data[0])data2View.setText(data[1])}
}

3.ViewModel对应的VM,来实现内存数据与表现数据的双向绑定

ViewModel类如下:

class ViewModel(data1View: EditText, data2View: EditText) {private var data1: StringAttr = StringAttr()private var data2: StringAttr = StringAttr()init {ViewBinder.bind(data1View, data1)ViewBinder.bind(data2View, data2)}fun init() {val data = DataCenter.getData()data1.value = data[0]data2.value = data[1]}
}

ViewBinder类实现双向绑定

class ViewBinder {companion object {fun bind(editText: EditText, stringAttr: StringAttr) {editText.doAfterTextChanged {if (!TextUtils.equals(stringAttr.value, it)) {stringAttr.value = it.toString()println("表现数据通知内存!${it}")}}stringAttr.onChangeListener = object : StringAttr.OnChangeListener {override fun onChange(newValue: String?) {if (!TextUtils.equals(stringAttr.value, newValue)) {editText.setText(newValue)println("内存通知表现数据!${newValue}")}}}}}
}

StringAttr类监听数据发生变化

class StringAttr {var value: String? = nullset(value) {field = valueonChangeListener?.onChange(value)}var onChangeListener: OnChangeListener? = nullinterface OnChangeListener {fun onChange(newValue: String?)}
}

这样一个简单的MVVM框架就实现了,Android中Google推出的ViewModel,主要目的是在设备配置发生变化(例如旋转屏幕)或者活动(Activity)被系统杀死后重新创建时,保存和管理UI相关的数据,以便恢复UI的状态。并不是用了这个ViewModel就是MVVM框架,这是错误的理解。

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

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

相关文章

Python密码测试程序

下面是一个简单的 Python 密码测试程序&#xff0c;用于检查用户输入的密码是否符合一些基本的安全要求&#xff0c;如长度、包含字母和数字等。这个程序可以作为一个基本的密码验证器&#xff0c;你可以根据需要进行修改和扩展。 1、问题背景 我们正在编写一个程序&#xff0…

数据结构:线性表(详解)

线性表 线性表的知识框架&#xff1a; 线性表的定义&#xff1a; 线性表是具有相同数据类型的n(n > 0)个数据元素的有限序列&#xff0c;当n 0时线性表为一个空表。 若用L命名为线性表&#xff0c;则数据集合为L {a1,a2,…,an}&#xff0c;其中a1称为表头元素&#xff0c…

从零开始搭建Springboot项目脚手架1:新建项目

1、技术栈 SpringBoot 3.2.5&#xff1a; 2、 新建项目 使用SpringInitializr 选择Lombok、Configuration Processor、Spring Web&#xff0c;同时IDEA也要安装Lombok插件 删除多余的Maven目录、Maven文件&#xff0c;把HELP.md改成README.md。 当然前提是已经安装好Maven和配…

力扣70 爬楼梯 C语言 动态规划 递归

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…

Java多线程:常见的线程的创建方法及Thread类详解

目录 一.并发编程相关概念 线程与进程 多线程 Java中线程的状态 二.线程的创建方法 方法一&#xff1a;继承Thread类 方法二&#xff1a;实现Runnable接口 其他方法 三.Thread类详解 Thread常见构造方法 Thread常见属性 Thread常见方法 start() 与 run() sleep(…

Redis教程——主从复制

在上篇文章我们学习了Redis教程——管道&#xff0c;这篇文章学习Redis教程——主从复制。 主从复制 为了数据更加安全可靠&#xff0c;在实际的项目中&#xff0c;肯定是有多个Redis服务&#xff0c;主机Redis以写为主&#xff0c;从机Redis以读为主&#xff0c;当主机Redis…

长难句打卡5.7

In December 2010 America’s Federal Trade Commission (FTC) proposed adding a “do not track” (DNT) option to Internet browsers, so that users could tell advertisers that they did not want to be followed. 2010年12月&#xff0c;美国美国联邦贸易委员会(FTC)提…

在数字化转型的浪潮中,CBDB百数服务商如何破浪前行?

在信息化时代&#xff0c;传统咨询企业面临着数字化转型的挑战与机遇。如何利用数字化技术提升业务效率、增强客户黏性&#xff0c;成为了行业关注的焦点。云南析比迪彼企业管理有限公司&#xff08;CBDB&#xff09;作为云南地区的企业咨询服务提供商&#xff0c;率先与百数展…

Springai入门

一、概述 1.1发展历史 1.2大模型 大模型&#xff0c;是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。其设计目的在于提高模型的表达能力和预测性能&#xff0c;以应对更加复杂的任务和数据&…

虚幻引擎5 Gameplay框架(二)

Gameplay重要类及重要功能使用方法&#xff08;一&#xff09; 配置LOG类及PlayerController的网络机制 探索验证GamePlay重要函数、类的执行顺序与含义 我们定义自己的日志&#xff0c;专门建立一个存放自己日志的类&#xff0c;这个类继承自BlueprintFunctionLibrary 然后…

零基础怎么学鸿蒙开发?

对于零基础的学习者来说&#xff0c;掌握鸿蒙开发不仅是迈向新技术的第一步&#xff0c;更是开拓职业道路的重要机遇。随着鸿蒙系统在各行各业的应用逐渐扩展&#xff0c;对于掌握这一项技术的开发人员需求也随之增长。下文将为大家提供针对零基础学习鸿蒙开发的逻辑&#xff0…

提高曝光率与点击率:海外KOL推广与社交媒体算法的完美结合

在当今数字化时代&#xff0c;社交媒体已经成为了企业和品牌推广的重要渠道之一&#xff0c;海外KOL也在各个领域拥有着庞大的粉丝群体和影响力。然而&#xff0c;想要在众多内容中脱颖而出&#xff0c;提高推广内容的曝光率和点击率&#xff0c;仅仅依靠KOL的影响力是不够的&a…

论文阅读-THE GENERALIZATION GAP IN OFFLINE REINFORCEMENT LEARNING(ICLR 2024)

1.Motivation 本文希望比较online RL、offline RL、序列决策和BC等方法的泛化能力(对于不同的初始状态、transition functions、reward functions&#xff0c;现阶段offline RL训练的方式都是在同一个环境下的数据集进行训练)。实验发现offline的算法相较于online算法对新环境…

特别提醒:2024年软考连考时间再次调整!

近期&#xff0c;辽宁省发布了今年5月软考考试安排&#xff0c;有以下变化&#xff1a; 高级论文单独考试&#xff08;2小时&#xff09;&#xff0c;之前是案例和论文一起考&#xff0c;案例剩下的时间可以给论文用&#xff0c;现在是综合和案例一起考&#xff0c;综合剩下的…

菜鸡学习netty源码(一)——ServerBootStrap启动

1.概述 对于初学者而然,写一个netty本地进行测试的Server端和Client端,我们最先接触到的类就是ServerBootstrap和Bootstrap。这两个类都有一个公共的父类就是AbstractBootstrap. 那既然 ServerBootstrap和Bootstrap都有一个公共的分类,那就证明它们两个肯定有很多公共的职…

Redis集群.md

Redis集群 本章是基于 CentOS7 下的 Redis 集群教程&#xff0c;包括&#xff1a; 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tcl然后将课前资料提供的Redis安装包上传到虚拟机的任意目录&#xf…

如何在CentOS部署青龙面板并实现无公网IP远程访问本地面板

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java双亲委派机制

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 概述 Java程序在运…

一起长锈:4 默认不可变的变量绑定与引用(从Java与C++转Rust之旅)

讲动人的故事,写懂人的代码 故事梗概:在她所维护的老旧Java系统即将被淘汰的危机边缘,这位在编程中总想快速完事的女程序员,希望能转岗到公司内部使用Rust语言的新项目组,因此开始自学Rust;然而,在掌握了Rust编程知识之后,为了通过Rust项目组的技术面试,使得转岗成功而…

sql优化思路

sql的优化经验 这里解释一下SQL语句的优化的原理 1.指明字段名称&#xff0c;可以尽量使用覆盖索引&#xff0c;避免回表查询&#xff0c;因此可以提高效率 2.字面意思&#xff0c;无需过多赘述。索引就是为了提高查询效率的。 3.图中两条sql直接可以使用union all 或者 uni…