В этой краткой статье я бы хотел рассказать о своем понимании различий паттернов проектирования MVC, MVP и MVVM.

Основная цель всех паттернов - это снижение затрат на разработку. Шаблонность действий облегчает коммуникацию между разработчиками и, соответственно, ускоряет написание новых фич.

Как ты мог заметить, основная разница между этими паттернами - это окончания MV- C, P и VM. Каждый из этих паттернов предлагает свой способ взаимодействия между View и Model.

Во всех паттернах которые мы сегодня рассмотрим, у нас есть три компонента: отвечающий за данные (Model), за отображение (View) и за обработку событий (Controller/Presenter/ViewModel), разница только в том как они между собой взаимодействуют.

Начнем с базы - Model-View-Controller

mvc.jpg

MVC разделяет приложение на три основных компонента:

Model

Под моделью понимается работа с данными. Модель получает данные, обрабатывает их и уведомляет view об изменениях.

View

View отвечает за отображение данных пользователю. У нас это то что пользователь видит и с чем взаимодействует

Controller

Controller отвечает за логику и обработку производимых пользователем событий.

Этот паттерн был предложен в конце прошлого века, идея оказалась плодотворной и сегодня современные архитектурные паттерны так или иначе являются производными от паттерна Model-View-Conroller

Небольшой пример: Допустим у нас есть простое приложение которое получает информацию о погоде.

Model:

data class WeatherData(val temperature: Double, val humidity: Double)

// Репозиторий, который предоставляет данные о погоде
class WeatherRepository {
    fun getWeather(): WeatherData {
        // Заглушка для данных о погоде
        return WeatherData(temperature = 25.0, humidity = 60.0)
    }
}

View:

class WeatherActivity : AppCompatActivity() {
    private lateinit var weatherController: WeatherController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_weather)
        
        // Инициализация контроллера
        weatherController = WeatherController(this)
        
        // Запрос обновления данных о погоде
        weatherController.updateWeather()
    }
    
    // Метод для отображения данных о погоде в UI
    fun showWeather(weatherData: WeatherData) {
        findViewById<TextView>(R.id.temperature).text = "Temperature: ${weatherData.temperature}°C"
        findViewById<TextView>(R.id.humidity).text = "Humidity: ${weatherData.humidity}%"
    }
}

Controller:

class WeatherController(private val weatherActivity: WeatherActivity) {
    private val weatherRepository = WeatherRepository()
    
    // Метод для получения данных о погоде и обновления UI
    fun updateWeather() {
        val weatherData = weatherRepository.getWeather()
        weatherActivity.showWeather(weatherData)
    }
}

Основные недостатки MVC: