移动应用架构设计:MVVM实战教程
开篇:什么是 MVVM?它有什么用?

在开发一个手机App时,你可能发现随着功能越来越多,代码也会越来越乱。这时候,我们需要一种“组织方式”,让我们的代码更有条理、容易维护——这就是架构模式的作用。
MVVM(Model-View-ViewModel)是一种专门为现代移动开发设计的架构模式,尤其适合使用像 Android 的 Jetpack ViewModel 和 LiveData 或 iOS 的 SwiftUI + Combine 这类响应式框架的项目。
简单来说:
- View(视图) 就是你看到的界面部分(按钮、文本框等)
- ViewModel 是连接 View 和 Model 的中间人,负责处理界面逻辑
- Model(模型) 就是负责管理数据和业务逻辑的部分,比如联网获取数据、本地数据库操作等
使用 MVVM 有以下几个好处:
- 代码结构清晰,职责分明
- 易于测试和调试
- 提高可维护性和团队协作效率
这篇文章将手把手带你从零开始理解并实践 MVVM 架构,通过一个小项目来加深理解。
环境准备:搭建你的开发环境

工具需求:
我们以 Android 平台为例,使用 Kotlin 编程语言来实现 MVVM。
你需要准备以下工具:
Android Studio
- 官网地址:https://developer.android.com/studio
- 安装后打开,按照提示安装默认 SDK 即可
Kotlin 插件
- Android Studio 默认已集成 Kotlin 支持
- 新建项目时记得选择 Kotlin 作为开发语言
熟悉基本语法(如变量、函数、类等)
如果你是 iOS 开发者,也可以参考后面章节的适配建议,本文重点讲解 Android 示例。
核心概念详解:通俗易懂地解释 MVVM

我们将用一个非常简单的 App 来说明 MVVM 的每个组成部分:显示一段欢迎语,并提供一个按钮更改文字内容。
1. Model:数据和业务逻辑
这部分负责处理“后台”工作,例如请求网络数据、读写数据库或一些计算逻辑。
示例:
// Model 类:用于管理数据
class WelcomeMessageModel {
fun getWelcomeMessage(): String {
return "Hello, welcome to our app!"
}
fun updateMessage(newMessage: String): String {
// 实际中可以进行保存到数据库等操作
return newMessage
}
}
📌 小贴士:
- Model 层不应该直接与界面交互
- 而应该专注于数据管理和业务逻辑
2. ViewModel:中介桥梁
ViewModel 是 MVVM 中最核心的角色。它的任务是:
- 接收来自 View 的请求
- 调用 Model 获取/处理数据
- 把结果准备好给 View 显示
在 Android 中我们使用 androidx.lifecycle.ViewModel 类。
示例:
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MainViewModel : ViewModel() {
private val _message = MutableLiveData<String>()
val message: LiveData<String> get() = _message
private val model = WelcomeMessageModel()
init {
_message.value = model.getWelcomeMessage()
}
fun changeMessage(newText: String) {
_message.value = model.updateMessage(newText)
}
}
📌 解释:
_message是私有的 MutableLiveData,表示可变的数据源message是对外只读的 LiveData,View 只能观察不能修改init是初始化方法,程序启动时自动调用changeMessage()是暴露给 View 的行为接口
3. View:展示界面内容
在 Android 中通常指的是 Activity 或 Fragment,它们负责显示内容和接收用户输入。
示例:
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import com.example.myapp.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 观察 LiveData,自动刷新 UI
viewModel.message.observe(this, Observer { msg ->
binding.textView.text = msg
})
binding.button.setOnClickListener {
viewModel.changeMessage("You clicked the button!")
}
}
}
📌 解释:
- 使用
by viewModels()自动创建 ViewModel 实例 binding.textView和binding.button是通过 ViewBinding 自动生成的控件引用- 使用
observe()监听 LiveData 的变化,实时更新界面
实战项目:一步步完成你的第一个 MVVM 应用

接下来我们将动手做一个完整的 Demo App。目标是:
在屏幕上显示一句话,点击按钮后,句子会变成新内容。
第一步:创建新项目
- 打开 Android Studio
- 选择 "New Project"
- 选择模板 “Empty Activity”
- 勾选 “Use view binding?” → YES
- 选择语言为 Kotlin
- 其余保持默认即可
第二步:添加 ViewModel 依赖项
在 build.gradle (Module) 文件中添加:
dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
}
同步 Gradle。
第三步:编写 ViewModel 类
新建文件 MainViewModel.kt,内容如下:
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MainViewModel : ViewModel() {
private val _message = MutableLiveData<String>()
val message: LiveData<String> get() = _message
init {
_message.value = "Welcome to MVVM Tutorial!"
}
fun updateMessage(newMessage: String) {
_message.value = newMessage
}
}
第四步:编写布局 XML
打开 res/layout/activity_main.xml(或使用 Binding 自动生成的布局),确保有以下控件:
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="24sp"
android:layout_marginTop="50dp"
android:layout_centerHorizontal="true"
/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
android:layout_below="@id/textView"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
/>
第五步:更新 MainActivity
修改 MainActivity.kt:
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.viewModelFactory
import com.example.mvvmexample.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 创建 ViewModel 实例
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
// 绑定 LiveData 到 TextView
viewModel.message.observe(this, Observer { message ->
binding.textView.text = message
})
// 设置按钮点击事件
binding.button.setOnClickListener {
viewModel.updateMessage("You just clicked a button!")
}
}
}
📌 注意:
- 我们手动创建了 ViewModel 实例用于演示目的
- 实际中推荐使用
by viewModels()更简洁
第六步:运行 App!
点击 Android Studio 的运行按钮,等待安装完成后,你会看到:
- 初始显示一句话:“Welcome to MVVM Tutorial!”
- 点击按钮后变为:“You just clicked a button!”
恭喜你,你已经完成了第一个基于 MVVM 架构的 App!
常见问题解答
Q1:为什么要用 LiveData 和 ViewModel,而不是直接操作 UI?
A:直接操作 UI 会导致代码混乱、难以测试和维护。LiveData 是“可观察”的数据类型,它可以自动通知 UI 更新,避免手动处理生命周期导致的崩溃。
Q2:为什么 ViewModel 不应该持有 Context?
A:如果 ViewModel 持有 Context(比如 Activity 的上下文),可能会引起内存泄漏。Context 是与界面相关的,而 ViewModel 是设计为不感知界面的。
Q3:我可以用 MVVM 做复杂的项目吗?
A:当然可以!MVVM 特别适合大型项目,因为它把各个组件分离开,便于多人协作、单元测试、后期扩展。
Q4:我可以不用 ViewBinding 吗?
A:可以,但 ViewBinding 能帮助我们快速绑定控件,减少 findViewById 调用,提高代码可读性。
学习建议:下一步该学什么?
你现在已经掌握了 MVVM 的基础。下面是一些进一步学习的方向建议:
✅ 1. 加入 Repository 层(进阶)
- 使用 Repository 来统一管理 Model 数据源,比如区分本地缓存和远程服务器
✅ 2. 使用 Room 数据库(持久化)
- 学习如何用 Room 把数据保存到设备上
✅ 3. 结合 Retrofit 进行网络请求
- 学习如何从服务器获取 JSON 数据并显示在界面上
✅ 4. 使用协程(Coroutines)简化异步任务
- 避免主线程阻塞,更好地处理耗时操作
✅ 5. 实践更复杂项目(如笔记应用、天气 App)
- 把所学知识真正应用到实际项目中去
总结

在这篇文章中,我们从零开始了解了什么是 MVVM 架构,并通过一个简易 Demo 实现了它的三个核心组件:
- Model 处理数据
- ViewModel 中介协调
- View 显示界面
整个过程注重实操、讲解通俗,让你更容易理解和上手。
希望这篇教程能帮你打下扎实的 MVVM 基础,迈出成为专业移动开发者的第一步!
如果你喜欢这样的教程,欢迎关注后续课程《高级 MVVM 模式与实战》、《Jetpack Compose 入门》等内容。
文章总字数:约2922字

评论 0