Kotlin 移动开发中的设计模式:MVVM 架构实战

Kotlin 移动开发中的设计模式:MVVM 架构实战

关键词:Kotlin、移动开发、设计模式、MVVM 架构、实战

摘要:本文主要围绕 Kotlin 在移动开发中运用 MVVM 架构展开。我们会先介绍 MVVM 架构的背景知识,用简单易懂的方式解释核心概念及其之间的关系。接着阐述 MVVM 架构的算法原理、数学模型等理论内容,并给出具体的操作步骤。通过项目实战,详细展示开发环境搭建、源代码实现与解读。还会提及 MVVM 架构在实际中的应用场景,推荐相关工具和资源,探讨其未来发展趋势与挑战。最后总结所学内容并提出思考题,帮助读者巩固知识。

背景介绍

目的和范围

在移动开发的世界里,有很多种设计模式可以帮助我们更好地组织代码,让代码更易于维护和扩展。MVVM 架构就是其中一种非常优秀的设计模式,我们的目的就是要学习如何在 Kotlin 移动开发中运用 MVVM 架构,掌握它的原理和实战技巧。我们会从基础概念入手,逐步深入到实际项目的开发中,让大家全面了解 MVVM 架构在 Kotlin 移动开发中的应用。

预期读者

这篇文章适合那些对移动开发有一定了解,想要学习 Kotlin 以及 MVVM 架构的开发者。无论是初学者还是有一定经验的开发者,都能从中学到新的知识和技能。

文档结构概述

本文会先介绍 MVVM 架构的核心概念和它们之间的联系,就像给大家介绍一群小伙伴,让大家知道他们都是谁,彼此之间有什么关系。然后讲解 MVVM 架构的算法原理和具体操作步骤,就像教大家如何使用工具来完成一项任务。接着通过项目实战,让大家亲身体验如何在实际项目中运用 MVVM 架构。之后会介绍 MVVM 架构的实际应用场景、推荐相关工具和资源,探讨其未来发展趋势与挑战。最后进行总结并提出思考题,帮助大家巩固所学知识。

术语表

核心术语定义
  • Kotlin:它是一种现代的编程语言,就像一个万能工具箱,在移动开发中非常好用。它和 Java 很像,但有很多更方便的功能,能让开发者更高效地编写代码。
  • MVVM 架构:这是一种设计模式,就像盖房子的蓝图,帮助我们更好地组织代码。它把代码分成不同的部分,每个部分都有自己的职责,让代码更有条理。
  • ViewModel:在 MVVM 架构中,它就像一个管家,负责处理业务逻辑和数据。它会和 View (界面)和 Model (数据模型)进行交互,让它们之间的沟通更顺畅。
  • LiveData:这是一种可观察的数据持有者,就像一个小广播,当数据发生变化时,它会通知所有关注它的人。在 MVVM 架构中,它可以实现数据的双向绑定。
相关概念解释
  • 数据绑定:就像把两个好朋友的手牵在一起,让数据和界面能够同步变化。当数据发生变化时,界面会自动更新;当用户在界面上进行操作时,数据也会相应地改变。
  • 单向数据流:就像一条只能朝一个方向流动的河流,数据的流动是有方向的,从数据源流向界面,这样可以让数据的流向更清晰,便于管理。
缩略词列表
  • MVVM:Model - View - ViewModel
  • UI:User Interface(用户界面)

核心概念与联系

故事引入

想象一下,你要开一家餐厅。餐厅有顾客(用户)、服务员(View)、厨师(ViewModel)和食材(Model)。顾客来到餐厅,坐在座位上点菜(用户在界面上进行操作)。服务员把顾客的点菜信息记录下来,然后交给厨师(View 把用户的操作信息传递给 ViewModel)。厨师根据点菜信息,使用食材做出美味的菜肴(ViewModel 根据数据和业务逻辑进行处理)。最后,服务员把做好的菜肴端给顾客(ViewModel 把处理好的数据传递给 View,View 更新界面显示给用户)。这就是 MVVM 架构的基本工作流程。

核心概念解释(像给小学生讲故事一样)

** 核心概念一:Model(数据模型)**
Model 就像餐厅里的食材,它包含了应用程序需要使用的数据。比如,在一个电商应用中,Model 可能包含商品的名称、价格、描述等信息。这些数据可以从数据库、网络等地方获取,就像餐厅的食材可以从菜市场、供应商那里采购一样。

** 核心概念二:View(视图)**
View 就像餐厅里的服务员,它负责和顾客(用户)进行交互,展示界面给用户看。比如,在一个电商应用中,View 可能是商品列表界面、商品详情界面等。它会把 Model 中的数据展示给用户,就像服务员把菜肴端给顾客一样。

** 核心概念三:ViewModel(视图模型)**
ViewModel 就像餐厅里的厨师,它负责处理业务逻辑和数据。比如,在一个电商应用中,ViewModel 可能负责从网络获取商品数据、对商品数据进行排序和过滤等操作。它会接收 View 传递过来的用户操作信息,根据这些信息对 Model 中的数据进行处理,然后把处理好的数据传递给 View,让 View 更新界面。

核心概念之间的关系(用小学生能理解的比喻)

** 概念一和概念二的关系:**
Model 和 View 的关系就像食材和服务员的关系。服务员(View)需要把食材(Model)做成的菜肴展示给顾客(用户)看,但服务员不能直接处理食材,需要厨师(ViewModel)的帮助。同样,View 需要展示 Model 中的数据,但不能直接操作 Model,需要通过 ViewModel 来进行。

** 概念二和概念三的关系:**
View 和 ViewModel 的关系就像服务员和厨师的关系。服务员(View)会把顾客(用户)的点菜信息传递给厨师(ViewModel),厨师根据这些信息做出菜肴。同样,View 会把用户的操作信息传递给 ViewModel,ViewModel 根据这些信息对数据进行处理,然后把处理好的数据传递给 View,让 View 更新界面。

** 概念一和概念三的关系:**
Model 和 ViewModel 的关系就像食材和厨师的关系。厨师(ViewModel)需要使用食材(Model)来做出美味的菜肴。同样,ViewModel 需要使用 Model 中的数据来进行业务逻辑处理。

核心概念原理和架构的文本示意图

在 MVVM 架构中,View 负责显示界面和与用户交互,它通过数据绑定的方式和 ViewModel 进行连接。ViewModel 负责处理业务逻辑和数据,它会从 Model 中获取数据,并对数据进行处理。Model 负责提供数据,它可以从数据库、网络等地方获取数据。当用户在 View 上进行操作时,View 会把操作信息传递给 ViewModel,ViewModel 根据这些信息对 Model 中的数据进行处理,然后把处理好的数据通过数据绑定的方式传递给 View,让 View 更新界面。

Mermaid 流程图

用户操作信息

数据处理结果

获取数据请求

数据

View

ViewModel

Model

核心算法原理 & 具体操作步骤

在 Kotlin 移动开发中运用 MVVM 架构,主要涉及到以下几个核心算法原理和操作步骤:

数据绑定原理

数据绑定是 MVVM 架构的核心之一,它通过观察者模式实现。在 Kotlin 中,我们可以使用 LiveData 来实现数据绑定。LiveData 是一种可观察的数据持有者,当数据发生变化时,它会通知所有注册的观察者。

以下是一个简单的 Kotlin 代码示例:

importandroidx.lifecycle.LiveDataimportandroidx.lifecycle.MutableLiveDataimportandroidx.lifecycle.ViewModel// 定义一个 ViewModelclassMyViewModel:ViewModel(){// 创建一个 MutableLiveData 对象,用于存储数据privateval_message=MutableLiveData<String>()// 提供一个不可变的 LiveData 对象给外部使用valmessage:LiveData<String>=_message// 提供一个方法来更新数据funupdateMessage(newMessage:String){_message.value=newMessage}}

在上面的代码中,我们定义了一个 MyViewModel 类,它继承自 ViewModel。在 MyViewModel 类中,我们创建了一个 MutableLiveData 对象_message来存储数据,同时提供了一个不可变的 LiveData 对象message给外部使用。当我们调用updateMessage方法更新数据时,LiveData 会自动通知所有注册的观察者。

具体操作步骤

  1. 创建 ViewModel:首先,我们需要创建一个 ViewModel 类,用于处理业务逻辑和数据。可以继承自androidx.lifecycle.ViewModel类。
  2. 定义 LiveData:在 ViewModel 类中,定义一个或多个 LiveData 对象,用于存储数据。
  3. 更新 LiveData 数据:在 ViewModel 类中,提供一些方法来更新 LiveData 中的数据。
  4. 在 View 中观察 LiveData:在 Activity 或 Fragment 中,通过ViewModelProvider获取 ViewModel 实例,并观察 LiveData 对象的变化。当 LiveData 中的数据发生变化时,更新界面。

以下是一个完整的示例代码:

importandroidx.appcompat.app.AppCompatActivityimportandroid.os.Bundleimportandroidx.lifecycle.Observerimportandroidx.lifecycle.ViewModelProviderimportkotlinx.android.synthetic.main.activity_main.*classMainActivity:AppCompatActivity(){privatelateinitvarviewModel:MyViewModeloverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取 ViewModel 实例viewModel=ViewModelProvider(this).get(MyViewModel::class.java)// 观察 LiveData 对象的变化viewModel.message.observe(this,Observer{newMessage->// 更新界面textView.text=newMessage})// 点击按钮更新数据button.setOnClickListener{viewModel.updateMessage("Hello, MVVM!")}}}

在上面的代码中,我们在MainActivity中获取了MyViewModel实例,并观察了messageLiveData 对象的变化。当点击按钮时,调用updateMessage方法更新数据,LiveData 会自动通知观察者,更新界面上的文本。

数学模型和公式 & 详细讲解 & 举例说明

在 MVVM 架构中,虽然没有像物理、数学领域那样复杂的数学模型和公式,但我们可以用一些简单的数学概念来理解它的原理。

数据绑定的数学模型

数据绑定可以看作是一个函数映射关系。假设我们有一个数据对象D DD和一个视图对象V VV,数据绑定就是一个函数f ff,它将数据对象D DD映射到视图对象V VV上,即V = f ( D ) V = f(D)V=f(D)。当数据对象D DD发生变化时,函数f ff会自动更新视图对象V VV

例如,在上面的代码示例中,messageLiveData 就是数据对象D DDtextView就是视图对象V VV,数据绑定的函数f ff就是observe方法,它将message的变化映射到textView上。

单向数据流的数学模型

单向数据流可以看作是一个有向图。数据从数据源(Model)流向视图(View),就像图中的节点之间有一个方向。假设我们有一个数据源S SS,一个视图V VV,和一个处理函数g gg,单向数据流可以表示为V = g ( S ) V = g(S)V=g(S)。处理函数g gg就是 ViewModel 中的业务逻辑处理。

例如,在电商应用中,商品数据从数据库(数据源S SS)流向商品列表界面(视图V VV),ViewModel 中的数据获取和处理逻辑就是处理函数g gg

项目实战:代码实际案例和详细解释说明

开发环境搭建

  1. 安装 Android Studio:Android Studio 是开发 Android 应用的官方 IDE,我们可以从 官方网站 下载并安装。
  2. 创建新的 Android 项目:打开 Android Studio,选择Start a new Android Studio project,按照向导创建一个新的 Android 项目。
  3. 添加依赖:在项目的build.gradle文件中添加 Kotlin 和 MVVM 相关的依赖,例如:
dependencies{implementation'androidx.appcompat:appcompat:1.3.1'implementation'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'implementation'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'}

源代码详细实现和代码解读

我们以一个简单的待办事项应用为例,来展示 MVVM 架构的实际应用。

1. 创建数据模型(Model)
// 定义待办事项数据类dataclassTodoItem(valid:Int,valtitle:String,valisCompleted:Boolean)

在上面的代码中,我们定义了一个TodoItem数据类,用于表示待办事项的数据模型。

2. 创建 ViewModel
importandroidx.lifecycle.LiveDataimportandroidx.lifecycle.MutableLiveDataimportandroidx.lifecycle.ViewModelclassTodoViewModel:ViewModel(){// 创建一个 MutableLiveData 对象,用于存储待办事项列表privateval_todoList=MutableLiveData<List<TodoItem>>()// 提供一个不可变的 LiveData 对象给外部使用valtodoList:LiveData<List<TodoItem>>=_todoListinit{// 初始化待办事项列表valinitialList=listOf(TodoItem(1,"Buy groceries",false),TodoItem(2,"Do homework",false))_todoList.value=initialList}// 提供一个方法来添加待办事项funaddTodoItem(newItem:TodoItem){valcurrentList=_todoList.value.orEmpty().toMutableList()currentList.add(newItem)_todoList.value=currentList}}

在上面的代码中,我们定义了一个TodoViewModel类,用于处理待办事项的业务逻辑和数据。在init方法中,我们初始化了待办事项列表。addTodoItem方法用于添加新的待办事项。

3. 创建 View(Activity)
importandroidx.appcompat.app.AppCompatActivityimportandroid.os.Bundleimportandroidx.lifecycle.Observerimportandroidx.lifecycle.ViewModelProviderimportkotlinx.android.synthetic.main.activity_main.*classMainActivity:AppCompatActivity(){privatelateinitvarviewModel:TodoViewModeloverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取 ViewModel 实例viewModel=ViewModelProvider(this).get(TodoViewModel::class.java)// 观察待办事项列表的变化viewModel.todoList.observe(this,Observer{todoList->// 更新界面valtodoItemsText=todoList.joinToString("\n"){it.title}textView.text=todoItemsText})// 点击按钮添加新的待办事项button.setOnClickListener{valnewItem=TodoItem(3,"Go for a walk",false)viewModel.addTodoItem(newItem)}}}

在上面的代码中,我们在MainActivity中获取了TodoViewModel实例,并观察了todoListLiveData 对象的变化。当点击按钮时,调用addTodoItem方法添加新的待办事项,LiveData 会自动通知观察者,更新界面上的文本。

代码解读与分析

  • 数据绑定:通过 LiveData 实现了数据和界面的绑定,当数据发生变化时,界面会自动更新。
  • 业务逻辑分离:ViewModel 负责处理业务逻辑,View 只负责显示界面和与用户交互,实现了业务逻辑和界面的分离,提高了代码的可维护性和可测试性。
  • 生命周期管理:ViewModel 会自动处理生命周期,当 Activity 或 Fragment 销毁时,ViewModel 不会被销毁,避免了数据丢失的问题。

实际应用场景

MVVM 架构在移动开发中有很多实际应用场景,以下是一些常见的场景:

电商应用

在电商应用中,MVVM 架构可以很好地处理商品列表、商品详情、购物车等功能。ViewModel 可以负责从网络获取商品数据、对商品数据进行排序和过滤等操作,View 负责展示商品信息和与用户交互。

社交应用

在社交应用中,MVVM 架构可以用于处理用户信息展示、好友列表、消息列表等功能。ViewModel 可以负责从数据库或网络获取用户数据和消息数据,View 负责展示用户信息和消息内容。

新闻应用

在新闻应用中,MVVM 架构可以用于处理新闻列表、新闻详情等功能。ViewModel 可以负责从网络获取新闻数据,对新闻数据进行分类和排序等操作,View 负责展示新闻信息和与用户交互。

工具和资源推荐

  • Android Studio:开发 Android 应用的官方 IDE,提供了丰富的开发工具和调试功能。
  • Kotlin 官方文档:可以从 Kotlin 官方网站 查看 Kotlin 的官方文档,学习 Kotlin 的语法和特性。
  • Android Architecture Components 官方文档:可以从 Android 开发者网站 查看 Android Architecture Components 的官方文档,学习 MVVM 架构的相关知识。
  • GitHub:可以在 GitHub 上搜索一些优秀的 MVVM 架构开源项目,学习他人的代码实现。

未来发展趋势与挑战

发展趋势

  • 与新技术融合:MVVM 架构可能会与人工智能、机器学习等新技术融合,为用户提供更智能、个性化的应用体验。
  • 跨平台开发:随着跨平台开发技术的发展,MVVM 架构可能会在跨平台开发中得到更广泛的应用,提高开发效率和代码复用性。

挑战

  • 学习成本:对于初学者来说,MVVM 架构的概念和使用方法可能比较复杂,需要一定的学习成本。
  • 性能优化:在处理大量数据和复杂业务逻辑时,MVVM 架构可能会面临性能问题,需要进行性能优化。

总结:学到了什么?

核心概念回顾:

  • Model:就像餐厅里的食材,包含了应用程序需要使用的数据。
  • View:就像餐厅里的服务员,负责和用户进行交互,展示界面给用户看。
  • ViewModel:就像餐厅里的厨师,负责处理业务逻辑和数据,连接 Model 和 View。
  • LiveData:就像一个小广播,实现了数据的双向绑定,当数据发生变化时,会通知所有关注它的人。

概念关系回顾:

  • Model 和 View 通过 ViewModel 进行交互,View 不能直接操作 Model,需要通过 ViewModel 来进行。
  • View 把用户的操作信息传递给 ViewModel,ViewModel 根据这些信息对 Model 中的数据进行处理,然后把处理好的数据传递给 View,让 View 更新界面。

思考题:动动小脑筋

思考题一:

在实际项目中,如何优化 MVVM 架构的性能?

思考题二:

如果要在 MVVM 架构中实现多语言支持,应该怎么做?

附录:常见问题与解答

问题一:LiveData 和 MutableLiveData 有什么区别?

LiveData 是一个不可变的数据持有者,外部只能观察它的数据变化,不能直接修改它的数据。MutableLiveData 是 LiveData 的子类,它是一个可变的数据持有者,外部可以通过setValuepostValue方法修改它的数据。

问题二:ViewModel 在 Activity 或 Fragment 销毁后会怎样?

ViewModel 会在 Activity 或 Fragment 销毁后仍然存在,直到它的宿主 Activity 或 Fragment 的生命周期结束。这样可以避免在屏幕旋转等情况下数据丢失的问题。

扩展阅读 & 参考资料

  • 《Android 移动开发从入门到精通》
  • 《Kotlin 实战》
  • Android 开发者官方文档:https://developer.android.com/
  • Kotlin 官方网站:https://kotlinlang.org/

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

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

相关文章

企业估值中的量子点显示技术应用评估

企业估值中的量子点显示技术应用评估 关键词:企业估值、量子点显示技术、应用评估、技术原理、市场价值 摘要:本文聚焦于企业估值中量子点显示技术的应用评估。首先介绍了研究的背景、目的、预期读者、文档结构和相关术语。接着阐述了量子点显示技术的核心概念、原理和架构,…

2026年宜宾专业家庭搬家公司推荐指南

2026年宜宾专业家庭搬家公司推荐指南一、宜宾居民搬家行业背景与推荐依据据《2026-2030年中国居民搬家服务行业发展白皮书》数据显示,2026年川南地区居民搬家需求同比增长21%,其中宜宾市因房地产市场活跃度提升,家庭…

论文开题“黑科技”大揭秘:书匠策AI如何让你的研究赢在起点?

对于许多学术新手来说&#xff0c;论文开题报告就像一座难以翻越的大山——选题撞车、文献堆砌、逻辑混乱、格式错乱……这些问题常常让人焦头烂额。别担心&#xff01;今天我们要揭秘一款“科研神器”——书匠策AI&#xff0c;它用智能算法和海量学术数据&#xff0c;为你的开…

《AI Flow: Perspectives, Scenarios, and Approaches》论文解读

《AI Flow: Perspectives, Scenarios, and Approaches》论文深度解读 &#xff08;论文链接&#xff1a;https://arxiv.org/html/2506.12479v1&#xff0c;发布于2025年6月14日&#xff0c;领域&#xff1a;cs.AI&#xff09; 一、论文基本信息 1. 核心团队与背景 作者单位&…

论文开题不再愁!书匠策AI:你的学术“开题神器”

在学术研究的漫漫征途中&#xff0c;论文开题报告就像是一座灯塔&#xff0c;为我们指引着研究方向。它不仅是对研究项目的初步规划&#xff0c;更是向评审专家展示研究价值与可行性的重要窗口。然而&#xff0c;对于许多研究者&#xff0c;尤其是初涉学术领域的新手来说&#…

论文开题“神器”大揭秘:书匠策AI如何让你的研究赢在起点?

在学术研究的赛道上&#xff0c;开题报告就像运动员的起跑姿势——姿势对了&#xff0c;才能跑得又快又稳。但现实中&#xff0c;许多研究者&#xff08;尤其是刚入门的新手&#xff09;常常被这些问题困扰&#xff1a;选题太普通&#xff0c;缺乏创新性&#xff1b;文献综述像…

论文开题“黑科技”:书匠策AI如何让你的选题秒变“学术顶流”

对于许多学术小白来说&#xff0c;论文开题就像一场“噩梦”——选题太宽泛怕被导师说“假大空”&#xff0c;选题太冷门又怕找不到参考文献&#xff1b;文献综述写得像“流水账”&#xff0c;研究方法设计得漏洞百出……别慌&#xff01;今天要介绍的这款“学术神器”——书匠…

论文开题不再愁!书匠策AI:你的学术“导航仪”

在学术的浩瀚海洋中&#xff0c;论文开题报告就像是一座灯塔&#xff0c;为后续的研究指引方向。然而&#xff0c;对于许多研究生和科研新手来说&#xff0c;撰写开题报告却像是一场“噩梦”——选题撞车、文献混乱、逻辑不清、格式错乱……这些问题如同汹涌的波涛&#xff0c;…

论文开题不再愁!揭秘书匠策AI的“科研魔法棒”

在学术研究的道路上&#xff0c;开题报告就像是一座灯塔&#xff0c;为后续的研究指引方向。然而&#xff0c;对于许多研究者&#xff0c;尤其是刚踏入学术领域的新手来说&#xff0c;撰写一份高质量的开题报告却是一项极具挑战性的任务。选题没思路、文献梳理混乱、研究方法设…

开题报告不再愁!书匠策AI:你的学术写作“智能导航仪”

在学术研究的漫漫征途中&#xff0c;开题报告宛如一座明亮的灯塔&#xff0c;为后续的研究指引方向。然而&#xff0c;对于许多研究者&#xff0c;尤其是初涉学术领域的新手来说&#xff0c;撰写一份高质量的开题报告却如同攀登一座陡峭的山峰&#xff0c;充满了挑战与迷茫。别…

导师严选10个AI论文软件,助你轻松搞定本科毕业论文!

导师严选10个AI论文软件&#xff0c;助你轻松搞定本科毕业论文&#xff01; 论文写作的“隐形助手”&#xff0c;你真的了解吗&#xff1f; 在本科阶段&#xff0c;论文写作往往成为许多学生最头疼的环节。从选题到开题&#xff0c;再到撰写与降重&#xff0c;每一步都需要大量…

2026年家庭搬家公司权威推荐:企事业单位搬迁/公司搬家/写字楼搬迁/别墅搬家/办公室搬迁/医院搬迁/单位搬家/选择指南

2026宜宾家庭搬家优质服务推荐榜一、行业背景与推荐依据据《2026-2026中国居民搬家服务行业白皮书》数据显示,宜宾地区2026年居民搬家需求同比增长12.7%,其中家庭搬家占整体搬家业务的68%。当前市场存在报价不透明、…

2026年优质水质检测公司推荐榜单

2026年优质水质检测公司推荐榜单行业背景与筛选依据据《2026年中国环境检测行业发展白皮书》数据显示,国内水质检测市场年复合增长率超12%,随着《水污染防治法》等政策趋严,市政、医疗、工业等主体的合规检测需求持…

python + vue 健康饮食食材烹饪管理系统vue3

目录健康饮食食材烹饪管理系统&#xff08;Python Vue3&#xff09;摘要系统概述技术栈核心功能扩展性应用场景项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作健康饮食食材烹饪管理系统&#xff08;Pytho…

python + vue 商场摊位商城管理系统vue3

目录 技术栈概述核心功能模块关键实现示例部署与优化 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 技术栈概述 Python与Vue3结合的商场摊位商城管理系统通常采用前后端分离架构。后端使用Python框架&a…

2026乐山专业鳝丝店品牌推荐榜

2026乐山专业鳝丝店品牌推荐榜一、行业背景与推荐依据据《2026-2026川味特色餐饮发展白皮书》数据显示,川味鳝丝赛道年复合增长率达18.2%,乐山作为临江鳝丝的发源地,年均接待鳝丝消费人次超200万,是川味餐饮的核心…

GEO优化服务商怎么选?2026技术决胜版(核心技术+实力榜单+精准适配)

2026年,生成式AI搜索市场规模突破千亿,80%的用户决策路径已转移至AI对话框(数据来源:中欧AI与营销创新实验室《2026 GEO行业白皮书》)。传统“内容堆砌+关键词优化”的GEO模式彻底失效,AI大模型对内容结构化、权…

用友BIP创建用户

用户点击 新建创建用户创建成功

2026年乐山临江鳝丝店厂家推荐:临江鳝丝店哪家靠谱、临江鳝丝店排名前五、临江鳝丝店排名前十、乐山临江鳝丝店哪个专业选择指南

2026评价高的乐山临江鳝丝店品牌推荐行业背景与推荐依据据《2026川渝特色餐饮消费白皮书》数据显示,川味鳝鱼餐饮市场年复合增长率达12.3%,乐山作为临江鳝丝发源地,成为游客必打卡品类,年接待游客量突破200万人次。…

在视觉领域,transformer为什么能代替CNN? - Kernel

当数据集较小时,CNN 的性能更好;但当数据量大到一定程度(如 JFT-300M 数据集),Transformer(ViT)的性能曲线会斜率更高,最终反超 CNN。其原因可以归结为以下三点: 表达能力的上限 CNN 的归纳偏置(局部性、平移…