Junior
Разкажи за патърна MVVM.
sobes.tech AI
Отговор от AI
Модел-Преглед-Модел на преглед (MVVM) е архитектурен шаблон, който разделя потребителския интерфейс (View) от бизнес логиката (Model) чрез посредник - Модел на прегледа (ViewModel).
- Model: Представлява данните и бизнес логиката на приложението. Не съдържа специфична за UI логика.
- View: Показва данните от ViewModel и изпраща действия на потребителя (например натискания на бутони) към ViewModel. Не съдържа бизнес логика, само логика за представяне.
- ViewModel: действа като свързващо звено. Предоставя данни от Model за View във формат, подходящ за показване, и обработва заявки от View, като актуализира Model. Съдържа логика за представяне, но не манипулира директно View. Често използва LiveData или StateFlow за реактивни актуализации.
Предимства:
- Разделяне на отговорностите: Подобрява четливостта и поддръжката на кода.
- Тестируемост: ViewModel е лесен за тестване в изолация, тъй като не зависи от Android API.
- Поддръжка на жизнения цикъл: ViewModel оцелява при промени в конфигурацията (например завъртане на екрана) и избягва повторно получаване на данни.
- Подобрена модулност.
Примерна структура:
// Модел (репозитори пример)
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()
}
}
// Преглед (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 и др.
}
}