架构模式
MVVM 与 Repository。
架构模式
这一课你将能做到
- 画出 MVVM 架构图,说明 View、ViewModel、Model 三层的职责边界
- 实现一个完整的 Repository 层,整合网络与本地数据源
- 对比 MVP、MVVM、MVI 的优劣,并解释为什么 Google 推荐 MVVM
为什么要学
没有架构的代码是「意大利面条」:Activity 里塞网络请求、数据库操作、业务逻辑,几千行后没人能改。架构模式不是银弹,但它是「如何让代码可测试、可维护、可扩展」的共识方案。对于 Web 前端,MVVM 就像 React + Redux + Service 层的组合。
人话:架构就是「分锅」。View 只负责显示,ViewModel 只负责状态,Model 只负责数据。出了问题,你知道去哪层找。代码评审时,你知道该骂谁。
面试中,「MVVM 各层职责」、「ViewModel 为什么能存活配置变更」、「Repository 模式的作用」是必考题。
先建立图像
┌─────────────────────────────────────────┐
│ UI 层 │
│ ┌─────────┐ ┌─────────┐ │
│ │ Compose │ │ Fragment│ ← 只显示 │
│ │ 页面 │ │ 页面 │ 和交互 │
│ └────┬────┘ └────┬────┘ │
│ └─────────────┘ │
│ ↓ StateFlow │
│ ┌─────────────────────┐ │
│ │ ViewModel │ ← 状态管理 │
│ │ (业务逻辑/状态保存) │ 和逻辑 │
│ └──────────┬──────────┘ │
│ ↓ 调用 │
│ ┌─────────────────────┐ │
│ │ Repository │ ← 数据协调 │
│ │ (单一数据源入口) │ 和缓存 │
│ └──────────┬──────────┘ │
│ ↓ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │Retrofit│ │ Room │ │DataStore│ │
│ │ (网络) │ │ (数据库)│ │ (偏好) │ │
│ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────┘
跟着做
步骤 1:定义数据模型
// 网络层 DTO
data class TrackDto(
val slug: String,
val title: String,
val description: String,
val lesson_count: Int,
val updated_at: String
)
// 数据库 Entity
@Entity(tableName = "tracks")
data class TrackEntity(
@PrimaryKey val slug: String,
val title: String,
val description: String,
val lessonCount: Int,
val updatedAt: String,
val isFavorite: Boolean = false
)
// UI 层 Model
data class TrackUiModel(
val slug: String,
val title: String,
val description: String,
val lessonCount: Int,
val progress: Int,
val isFavorite: Boolean
)
步骤 2:Mapper 层转换
fun TrackDto.toEntity(): TrackEntity = TrackEntity(
slug = slug,
title = title,
description = description,
lessonCount = lesson_count,
updatedAt = updated_at
)
fun TrackEntity.toUiModel(progress: Int = 0): TrackUiModel = TrackUiModel(
slug = slug,
title = title,
description = description,
lessonCount = lessonCount,
progress = progress,
isFavorite = isFavorite
)