Ответ
MVP (Model-View-Presenter):
- View пассивна, делегирует логику Presenter'у.
- Presenter управляет View через интерфейс, что упрощает тестирование.
Пример:
interface MainView { fun showData(data: String) }
class MainPresenter(private val view: MainView) {
fun loadData() { view.showData("Loaded") }
}
MVVM (Model-View-ViewModel):
- ViewModel хранит состояние и логику, не зависит от View.
- Связь через DataBinding/LiveData (автоматическая).
Пример:
class MainViewModel : ViewModel() {
val data = MutableLiveData<String>()
fun loadData() { data.value = "Loaded" }
}
MVI (Model-View-Intent):
- Односторонний поток данных: Intent → Model → View.
- Состояние иммутабельно, что упрощает отладку.
Пример:
data class State(val data: String)
sealed class Intent { object LoadData : Intent() }
class MainReducer {
fun reduce(state: State, intent: Intent) = when(intent) {
is Intent.LoadData -> state.copy(data = "Loaded")
}
}
Ключевые отличия:
- MVP: ручная привязка View-Presenter.
- MVVM: автоматическая привязка через реактивные потоки.
- MVI: строгая односторонность и иммутабельность.