// ================================================================ // MVC (Model-View-Controller) // https://ru.wikipedia.org/wiki/Model-View-Controller // https://upload.wikimedia.org/wikipedia/commons/f/fd/MVC-Process.png // ================================================================ /** Концепция MVC позволяет разделить данные (модель), представление и обработку действий (производимую контроллером) пользователя на три отдельных компонента:
-
Модель:
-
Предоставляет знания: данные и методы работы с этими данными;
-
Реагирует на запросы, изменяя своё состояние;
-
Не содержит информации, как эти знания можно визуализировать;
-
Представление, вид — отвечает за отображение информации (визуализацию). Часто в качестве представления выступает форма (окно) с графическими элементами;
-
Контроллер — обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
Важно отметить, что как представление, так и контроллер зависят от модели; однако модель (активная) не зависит ни от представления, ни от контроллера. Тем самым достигается назначение такого разделения: оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
Для реализации схемы MVC используется достаточно большое число шаблонов проектирования (в зависимости от сложности архитектурного решения), основные из которых — «наблюдатель», «стратегия», «компоновщик» (composite):
-
Наиболее типичная реализация — в которой вид отделён от модели путём установления между ними протокола взаимодействия, использующего «аппарат событий» (обозначение «событиями» определённых ситуаций, возникающих в ходе выполнения программы, — и рассылка уведомлений о них всем тем, кто подписался на получение): при каждом особом изменении внутренних данных в модели (обозначенном как «событие»), она оповещает о нём те зависящие от неё представления, которые подписаны на получение такого оповещения — и представление обновляется. Так используется шаблон «наблюдатель»;
-
При обработке реакции пользователя — представление выбирает, в зависимости от нужной реакции, нужный контроллер, который обеспечит ту или иную связь с моделью. Для этого используется шаблон «стратегия», или вместо этого может быть модификация с использованием шаблона «команда»;
-
Для возможности однотипного обращения с подобъектами сложно-составного иерархического вида — может использоваться шаблон «компоновщик». Кроме того, могут использоваться и другие шаблоны проектирования — например, «фабричный метод», который позволит задать по умолчанию тип контроллера для соответствующего вида. */