Skip to content

Instantly share code, notes, and snippets.

@YozhEzhi
Created September 4, 2020 20:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YozhEzhi/df5221fe7d5345dc9b3ba9d305f05ecf to your computer and use it in GitHub Desktop.
Save YozhEzhi/df5221fe7d5345dc9b3ba9d305f05ecf to your computer and use it in GitHub Desktop.

// ================================================================ // 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):

  • Наиболее типичная реализация — в которой вид отделён от модели путём установления между ними протокола взаимодействия, использующего «аппарат событий» (обозначение «событиями» определённых ситуаций, возникающих в ходе выполнения программы, — и рассылка уведомлений о них всем тем, кто подписался на получение): при каждом особом изменении внутренних данных в модели (обозначенном как «событие»), она оповещает о нём те зависящие от неё представления, которые подписаны на получение такого оповещения — и представление обновляется. Так используется шаблон «наблюдатель»;

  • При обработке реакции пользователя — представление выбирает, в зависимости от нужной реакции, нужный контроллер, который обеспечит ту или иную связь с моделью. Для этого используется шаблон «стратегия», или вместо этого может быть модификация с использованием шаблона «команда»;

  • Для возможности однотипного обращения с подобъектами сложно-составного иерархического вида — может использоваться шаблон «компоновщик». Кроме того, могут использоваться и другие шаблоны проектирования — например, «фабричный метод», который позволит задать по умолчанию тип контроллера для соответствующего вида. */

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment