Паттерн — повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого контекста.
Model-View-Controller (MVC)
Под Моделью, понимается часть содержащая в себе функциональную бизнес-логику приложения. Модель должна быть полностью независима от остальных частей продукта. Модельный слой ничего не должен знать об элементах дизайна, и каким образом он будет отображаться. Достигается результат, позволяющий менять представление данных, то как они отображаются, не трогая саму Модель. Модель — это бизнес-логика приложения. Модель обладает знаниями о себе самой и не знает о контроллерах и представлениях. Модель — это слой данных (DAO, база данных, XML-файл), менеджер базы данных, набор объектов или просто логика приложения.
В обязанности Представления входит отображение полученных от Модели данных. Представление не может напрямую влиять на модель (доступ только на чтение к данным; КРАЙНЕ СПОРНОЕ "РЕЛИГИОЗНОЕ" УТВЕРЖДЕНИЕ).
В представлении реализуется отображение данных, которые получаются от модели любым способом.
Примеры представления: HTML-страница, WPF форма, Windows Form.
Наиболее распространенные виды MVC-паттерна, это:
Данный подход позволяет создавать абстракцию представления. Для этого необходимо выделить интерфейс представления с определенным набором свойств и методов. Презентер, в свою очередь, получает ссылку на реализацию интерфейса, подписывается на события представления и по запросу изменяет модель.
Признаки презентера:
Реализация:
Каждое представление должно реализовывать соответствующий интерфейс. Интерфейс представления определяет набор функций и событий, необходимых для взаимодействия с пользователем (например, IView.ShowErrorMessage(string msg)). Презентер должен иметь ссылку на реализацию соответствующего интерфейса, которую обычно передают в конструкторе.
Логика представления должна иметь ссылку на экземпляр презентера. Все события представления передаются для обработки в презентер и практически никогда не обрабатываются логикой представления (в т.ч. создания других представлений).
MVP используется в ситуации, когда невозможно связывание данных (нельзя использовать Binding).
Пример- Windows Forms.
Данный подход позволяет связывать элементы представления со свойствами и событиями View-модели. Можно утверждать, что каждый слой этого паттерна не знает о существовании другого слоя.
Признаки View-модели:
Реализация:
При использовании этого паттерна, представление не реализует соответствующий интерфейс (IView).
Представление должно иметь ссылку на источник данных (DataContex), которым в данном случае является View-модель. Элементы представления связаны (Bind) с соответствующими свойствами и событиями View-модели.
В свою очередь, View-модель реализует специальный интерфейс, который используется для автоматического обновления элементов представления. Примером такого интерфейса в WPF может быть INotifyPropertyChanged.
MVVM используется в ситуации, когда возможно связывание данных без необходимости ввода специальных интерфейсов представления (т.е. отсутствует необходимость реализовывать IView).
Пример использования - WPF.
Основная идея этого паттерна в том, что и контроллер и представление зависят от модели, но модель никак не зависит от этих двух компонент.
Признаки контроллера
Реализация:
Контроллер перехватывает событие извне и в соответствии с заложенной в него логикой, реагирует на это событие изменяя Модель, посредством вызова соответствующего метода. После изменения Модель использует событие о том что она изменилась, и все подписанные на это события Представления, получив его, обращаются к Модели за обновленными данными, после чего их и отображают.
MVC используется в ситуации, когда связь между представлением и другими частями приложения невозможна (и Вы не можете использовать MVVM или MVP). Пример - ASP.NET MVC.
Для MVVM связывание представления с View-моделью осуществляется автоматически, а для MVP — необходимо программировать.
Model-View-Controller (MVC)
Под Моделью, понимается часть содержащая в себе функциональную бизнес-логику приложения. Модель должна быть полностью независима от остальных частей продукта. Модельный слой ничего не должен знать об элементах дизайна, и каким образом он будет отображаться. Достигается результат, позволяющий менять представление данных, то как они отображаются, не трогая саму Модель. Модель — это бизнес-логика приложения. Модель обладает знаниями о себе самой и не знает о контроллерах и представлениях. Модель — это слой данных (DAO, база данных, XML-файл), менеджер базы данных, набор объектов или просто логика приложения.
В обязанности Представления входит отображение полученных от Модели данных. Представление не может напрямую влиять на модель (доступ только на чтение к данным; КРАЙНЕ СПОРНОЕ "РЕЛИГИОЗНОЕ" УТВЕРЖДЕНИЕ).
В представлении реализуется отображение данных, которые получаются от модели любым способом.
Примеры представления: HTML-страница, WPF форма, Windows Form.
Наиболее распространенные виды MVC-паттерна, это:
- Model-View-Controller (подвид вида)
- Model-View-Presenter
- Model-View-View Model
Model-View-Presenter
Данный подход позволяет создавать абстракцию представления. Для этого необходимо выделить интерфейс представления с определенным набором свойств и методов. Презентер, в свою очередь, получает ссылку на реализацию интерфейса, подписывается на события представления и по запросу изменяет модель.
Признаки презентера:
- Двухсторонняя коммуникация с представлением;
- Представление взаимодействует напрямую с презентером, путем вызова соответствующих функций или событий экземпляра презентера;
- Презентер взаимодействует с View путем использования специального интерфейса, реализованного представлением;
- Один экземпляр презентера связан с одним отображением.
Реализация:
Каждое представление должно реализовывать соответствующий интерфейс. Интерфейс представления определяет набор функций и событий, необходимых для взаимодействия с пользователем (например, IView.ShowErrorMessage(string msg)). Презентер должен иметь ссылку на реализацию соответствующего интерфейса, которую обычно передают в конструкторе.
Логика представления должна иметь ссылку на экземпляр презентера. Все события представления передаются для обработки в презентер и практически никогда не обрабатываются логикой представления (в т.ч. создания других представлений).
MVP используется в ситуации, когда невозможно связывание данных (нельзя использовать Binding).
Пример- Windows Forms.
Model-View-View Model
Данный подход позволяет связывать элементы представления со свойствами и событиями View-модели. Можно утверждать, что каждый слой этого паттерна не знает о существовании другого слоя.
Признаки View-модели:
- Двухсторонняя коммуникация с представлением;
- View-модель — это абстракция представления. Обычно означает, что свойства представления совпадают со свойствами View-модели / модели
- View-модель не имеет ссылки на интерфейс представления (IView). Изменение состояния View-модели автоматически изменяет представление и наоборот, поскольку используется механизм связывания данных (Bindings)
- Один экземпляр View-модели связан с одним отображением.
Реализация:
При использовании этого паттерна, представление не реализует соответствующий интерфейс (IView).
Представление должно иметь ссылку на источник данных (DataContex), которым в данном случае является View-модель. Элементы представления связаны (Bind) с соответствующими свойствами и событиями View-модели.
В свою очередь, View-модель реализует специальный интерфейс, который используется для автоматического обновления элементов представления. Примером такого интерфейса в WPF может быть INotifyPropertyChanged.
MVVM используется в ситуации, когда возможно связывание данных без необходимости ввода специальных интерфейсов представления (т.е. отсутствует необходимость реализовывать IView).
Пример использования - WPF.
Model-View-Controller
Основная идея этого паттерна в том, что и контроллер и представление зависят от модели, но модель никак не зависит от этих двух компонент.
Признаки контроллера
- Контроллер определяет, как представление должно быть отображено в данный момент;
- События представления могут повлиять только на контроллер. Контроллер может повлиять на модель и определить другое представление.
- Возможно несколько представлений только для одного контроллера.
Реализация:
Контроллер перехватывает событие извне и в соответствии с заложенной в него логикой, реагирует на это событие изменяя Модель, посредством вызова соответствующего метода. После изменения Модель использует событие о том что она изменилась, и все подписанные на это события Представления, получив его, обращаются к Модели за обновленными данными, после чего их и отображают.
MVC используется в ситуации, когда связь между представлением и другими частями приложения невозможна (и Вы не можете использовать MVVM или MVP). Пример - ASP.NET MVC.
Для MVVM связывание представления с View-моделью осуществляется автоматически, а для MVP — необходимо программировать.