Ответ
ViewModel взаимодействует с View через LiveData/StateFlow, автоматически обновляя UI при изменении данных (наблюдаемый паттерн). ViewModel переживает изменения конфигурации и не хранит ссылки на View, что предотвращает утечки памяти.
Presenter же напрямую управляет View через интерфейсы, требует ручной подписки/отписки и уязвим к утечкам, если View не очищена. Presenter уничтожается при повороте экрана.
Пример с ViewModel:
// ViewModel
val data = MutableLiveData<String>()
// Fragment
viewModel.data.observe(viewLifecycleOwner) { value ->
textView.text = value
}
Пример с Presenter:
// Presenter
fun attachView(view: ViewContract) {
this.view = view
}
fun updateData() {
view?.showData("new data")
}