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

在开发一个移动应用时,如何组织代码结构是一个非常重要的问题。如果你的代码没有良好的结构,随着功能越来越多,程序会变得难以维护和测试。
**MVVM(Model-View-ViewModel)**是一种常见的架构模式,特别适用于 Android 和 iOS 等现代移动平台的开发。它的目标是把 UI 层和数据处理层分离开,使代码更清晰、更易于维护。
你可以把它简单理解成这样:
| 角色 | 职责说明 |
|---|---|
| Model | 处理数据和业务逻辑 |
| View | 用户看到的界面(比如按钮、文本框) |
| ViewModel | 桥梁角色,将 Model 的数据传递给 View |
听起来有点抽象对吧?不用担心,接下来我们通过一个具体例子来讲解。
环境准备:搭建开发环境

为了更好地学习 MVVM,我们将使用 Android Studio + Kotlin 来编写示例。以下是详细的安装步骤:
1. 安装 Android Studio
- 访问官网 https://developer.android.com/studio
- 根据你的操作系统下载并安装 Android Studio
- 安装时选择推荐的配置即可
2. 配置 Kotlin 插件(Android Studio 已默认集成,可跳过)
- 打开 Android Studio →
File>Settings(Windows) 或Preferences(Mac) - 搜索 "Kotlin",确认是否已安装
- 若未安装,可通过插件中心搜索 “Kotlin” 安装
3. 创建新项目
- 启动 Android Studio,点击 "Start a new Android Studio project"
- 选择模板:Empty Activity
- 语言选择:Kotlin
- 其他设置保持默认,点击 Finish 即可
现在,你已经准备好写第一个 MVVM 示例了!
核心概念:用通俗的语言解释关键概念

我们继续用“用户登录页面”的场景来帮助你理解这三个核心概念:
1. View(视图)
View 就是你在手机上看到的一切元素。
例如:用户名输入框、密码输入框、登录按钮、加载进度条等等。
在 Android 中,View 通常是由 XML 文件定义的,如
activity_main.xml
<!-- activity_login.xml -->
<EditText
android:id="@+id/usernameInput"
android:hint="请输入用户名"/>
<Button
android:id="@+id/loginButton"
android:text="登录"/>
2. Model(模型)
Model 是处理数据的核心部分。
它负责从服务器获取数据、执行本地计算、保存信息等等。
举个简单的例子:验证用户输入是否合法。
// User.kt
data class User(val username: String, val password: String)
class LoginModel {
fun login(username: String, password: String): Boolean {
// 这里可以连接服务器或者做本地判断
return username == "admin" && password == "123456"
}
}
3. ViewModel(视图模型)
ViewModel 是沟通 Model 和 View 的桥梁。
它监听用户的操作(比如点击登录),调用 Model 获取结果,并把结果返回给 View。
// LoginViewModel.kt
class LoginViewModel : ViewModel() {
private val model = LoginModel()
fun checkLogin(username: String, password: String): Boolean {
return model.login(username, password)
}
}
💡 重点小结:
- Model 不关心 UI
- View 只负责显示
- ViewModel 把它们连接起来
实战项目:一步步完成一个登录页面

我们来做一个完整的登录页面 Demo,实现以下功能:
- 用户输入用户名和密码
- 点击登录按钮
- 判断是否正确(正确显示成功提示,否则弹出错误)
第一步:布局设计(View 层)
修改文件:res/layout/activity_login.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="20dp">
<EditText
android:id="@+id/usernameInput"
android:hint="用户名"/>
<EditText
android:id="@+id/passwordInput"
android:inputType="textPassword"
android:hint="密码"/>
<Button
android:id="@+id/loginButton"
android:text="登录"/>
</LinearLayout>
第二步:创建 Model 层
新建 Kotlin 文件 User.kt 和 LoginModel.kt:
// LoginModel.kt
class LoginModel {
fun validate(username: String, password: String): Boolean {
return username == "admin" && password == "123456"
}
}
第三步:创建 ViewModel 层
新建 LoginViewModel.kt:
// LoginViewModel.kt
import androidx.lifecycle.ViewModel
class LoginViewModel : ViewModel() {
private val model = LoginModel()
fun isValidUser(username: String, password: String): Boolean {
return model.validate(username, password)
}
}
第四步:绑定 ViewModel 到 Activity(即 View 层)
修改 LoginActivity.kt:
// LoginActivity.kt
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
class LoginActivity : AppCompatActivity() {
private lateinit var viewModel: LoginViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
// 初始化 ViewModel
viewModel = ViewModelProvider(this).get(LoginViewModel::class.java)
val usernameInput = findViewById<EditText>(R.id.usernameInput)
val passwordInput = findViewById<EditText>(R.id.passwordInput)
val loginButton = findViewById<Button>(R.id.loginButton)
loginButton.setOnClickListener {
val username = usernameInput.text.toString()
val password = passwordInput.text.toString()
if (viewModel.isValidUser(username, password)) {
Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "用户名或密码错误", Toast.LENGTH_SHORT).show()
}
}
}
}
✅ 运行效果:
当你输入用户名 admin 和密码 123456,点击登录就会提示“登录成功!”
常见问题解答(FAQ)
以下是一些初学者经常遇到的问题:
Q1:为什么需要 ViewModel?直接在 Activity 里写逻辑不行吗?
A:是可以写的,但是随着代码越来越复杂,Activity 会变得臃肿难维护。使用 ViewModel 可以让数据和 UI 分离,方便测试和扩展。
Q2:为什么不能在 ViewModel 里访问 UI 组件?
A:因为 ViewModel 的职责是纯逻辑处理,不应该依赖任何与 UI 相关的内容,这样才能保证灵活性和可重用性。
Q3:MVVM 和 MVC 有什么区别?
A:MVC 是早期流行的架构模式,但 View 和 Controller 之间耦合度高;而 MVVM 使用双向绑定机制,降低了耦合,更适合现代化移动开发。
Q4:我可以在 iOS 上使用 MVVM 吗?
A:当然可以!MVVM 不仅适用于 Android,也广泛应用于 iOS(SwiftUI / UIKit)开发中。
Q5:怎么测试 ViewModel?
A:你可以直接写单元测试来测试 ViewModel 中的方法,不需要启动整个 App,速度更快、更容易自动化测试。
学习建议:下一步该学什么?
恭喜你完成了第一个 MVVM 项目!这是很好的开始。下面这些方向可以帮你进一步提升技能:
🔹 1. 接触 Jetpack 组件(Android)
- LiveData / ViewModel / Room 数据库
- 推荐资源:Jetpack 官方文档
🔹 2. 引入数据绑定技术(Data Binding)
- 用一行代码绑定数据到 View
- 提升代码简洁性和性能
🔹 3. 接口通信(网络请求)
- 使用 Retrofit / Ktor 请求服务器数据
- 学习协程(Coroutines)处理异步任务
🔹 4. 实践更复杂的项目
- 商品列表页、购物车功能、数据库操作等
- 使用 Clean Architecture 架构进一步规范项目结构
总结

本文介绍了 MVVM 架构的基础知识,并通过一个具体的登录页面项目带你实践了整个流程。记住一句话:
MVVM 的核心思想是分离关注点:让每个模块只做自己擅长的事情。
掌握好 MVVM,会让你写出更加专业、稳定、可维护的移动应用!
如果你觉得这个教程对你有帮助,请分享给其他正在学习的同学,也欢迎继续阅读更多进阶内容。
🔚 完

评论 0