Архитектурный паттерн, разделяющий приложение на три взаимосвязанные части:
- Model (Модель): Представляет данные, бизнес-логику и правила работы с данными. Не зависит от представления и контроллера. Отвечает за состояние данных.
- View (Представление): Отображает данные из модели пользователю. Отвечает за пользовательский интерфейс. Не содержит бизнес-логики и напрямую не взаимодействует с моделью (получает данные через контроллер). Может уведомлять контроллер о событиях пользователя.
- Controller (Контроллер): Связывает модель и представление. Обрабатывает ввод пользователя, вызывает соответствующие методы модели для обновления данных и выбирает представление для отображения результата.
Взаимодействие:
- Пользователь взаимодействует с Представлением.
- Представление уведомляет Контроллер о действии пользователя.
- Контроллер обрабатывает действие, возможно, взаимодействуя с Моделью для обновления состояния или получения данных.
- Модель уведомляет Контроллер об изменениях данных (в некоторых реализациях, Модель напрямую уведомляет Представление).
- Контроллер выбирает соответствующее Представление для обновления пользовательского интерфейса и передает ему данные из Модели.
- Представление обновляется, отображая актуальные данные.
Преимущества:
- Разделение ответственности.
- Повышение тестируемости (можно тестировать Модель и Контроллер независимо).
- Улучшение сопровождаемости и модифицируемости кода.
- Возможность использовать несколько Представлений для одной Модели.
Недостатки:
- Усложнение структуры для простых приложений.
- Может возникнуть "толстый" контроллер (Massive Controller) при неправильном проектировании.
- Взаимодействие между компонентами может быть сложным.
Применение:
Широко используется в веб-разработке (например, фреймворки вроде Ruby on Rails, Django) и разработке десктопных приложений.