Назад к вопросам
Junior
67
questionbank
Расскажи о паттерне MVVM.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Модель-Представление-Модель представления (MVVM) — архитектурный паттерн, отделяющий пользовательский интерфейс (View) от бизнес-логики (Model) с помощью посредника — Модели представления (ViewModel).
- Model: Представляет данные и бизнес-логику приложения. Не содержит никакой UI-специфичной логики.
- View: Отображает данные из ViewModel и отправляет действия пользователя (например, нажатия кнопок) в ViewModel. Не содержит бизнес-логики, только логику отображения.
- ViewModel: Выступает связующим звеном. Предоставляет данные из Model для View в удобном для отображения формате и обрабатывает запросы от View, обновляя Model. Содержит логику представления, но не напрямую манипулирует View. Часто использует LiveData или StateFlow для реактивного обновления View.
Преимущества:
- Разделение ответственности: Улучшает читаемость и сопровождаемость кода.
- Тестируемость: ViewModel легко тестировать в изоляции, поскольку она не зависит от Android API.
- Поддержка жизнеспособности: ViewModel переживает изменения конфигурации (например, поворот экрана) и избегает повторного получения данных.
- Улучшенная модульность.
Пример структуры:
// Model (репозиторий для примера)
class UserRepository {
fun getUsers(): List<User> {
// ... логика получения пользователей ...
return listOf(User("Alice"), User("Bob"))
}
}
// ViewModel
class UserViewModel(private val repository: UserRepository) : ViewModel() {
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>> = _users
init {
loadUsers()
}
private fun loadUsers() {
_users.value = repository.getUsers()
}
}
// View (Fragment/Activity)
class UserFragment : Fragment() {
private val viewModel: UserViewModel by viewModels() // Использование делегата от Android KTX
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.users.observe(viewLifecycleOwner) { userList ->
// Обновление UI (например, адаптера RecyclerView)
updateUI(userList)
}
}
private fun updateUI(userList: List<User>) {
// Логика обновления TextView, RecyclerView и т.д.
}
}