Если взглянуть за пределы RAD (перетаскивания и настройки) способа создания пользовательских интерфейсов, который многие инструменты поощряют, вы, скорее всего, натолкнетесь на три модели проектирования, которые называются Model-View-Controller , Model-View-Presenter и Model-View-ViewModel . Мой вопрос состоит из трех частей:
- Какие проблемы решают эти шаблоны?
- Чем они похожи?
- Насколько они разные?
design-patterns
model-view-controller
user-interface
mvp
glossary
Майк Минутилло
источник
источник
Ответы:
Model-View-Presenter
В MVP Presenter содержит бизнес-логику пользовательского интерфейса для представления. Все вызовы из View делегируются непосредственно в Presenter. Ведущий также отделен непосредственно от представления и общается с ним через интерфейс. Это делается для того, чтобы разрешить насмешку над видом в модульном тесте. Одним из общих атрибутов MVP является то, что должно быть много двусторонней диспетчеризации. Например, когда кто-то нажимает кнопку «Сохранить», обработчик события делегирует метод «OnSave» докладчика. Как только сохранение завершено, докладчик затем перезвонит представлению через его интерфейс, чтобы представление могло отобразить, что сохранение завершено.
MVP имеет тенденцию быть очень естественной моделью для достижения отдельного представления в веб-формах. Причина в том, что представление всегда создается первым во время выполнения ASP.NET. Вы можете узнать больше об обоих вариантах .
Два основных варианта
Пассивное представление: представление настолько глупо, насколько это возможно, и содержит практически нулевую логику. Ведущий - средний человек, который говорит с Видом и Моделью. Вид и Модель полностью защищены друг от друга. Модель может вызывать события, но докладчик подписывается на них для обновления представления. В пассивном просмотре нет прямой привязки данных, вместо этого вид предоставляет свойства сеттера, которые Presenter использует для установки данных. Все состояние управляется в Presenter, а не View.
Контролирующий контроллер . Ведущий обрабатывает жесты пользователя. Представление привязывается к модели напрямую через привязку данных. В этом случае работа докладчика заключается в том, чтобы передать модель представлению, чтобы оно могло с ней связываться. Ведущий также будет содержать логику для жестов, таких как нажатие кнопки, навигация и т. Д.
Model-View-Controller
В MVC контроллер отвечает за определение того, какое представление отображать в ответ на любое действие, в том числе при загрузке приложения. Это отличается от MVP, где действия направляются через представление к докладчику. В MVC каждое действие в представлении соотносится с вызовом контроллера и действием. В сети каждое действие включает в себя обращение к URL-адресу, с другой стороны которого есть контроллер, который отвечает. Как только этот Контроллер завершит свою обработку, он вернет правильный вид. Последовательность продолжается таким образом на протяжении всей жизни приложения:
Еще одно большое отличие от MVC заключается в том, что представление напрямую не связывается с моделью. Представление просто визуализируется и полностью не имеет состояния. В реализациях MVC View обычно не имеет никакой логики в коде позади. Это противоречит MVP, где это абсолютно необходимо, потому что, если View не делегирует Presenter, он никогда не будет вызван.
Модель презентации
Еще один шаблон, на который стоит обратить внимание, - это модель представления.шаблон. В этом шаблоне нет предъявителя. Вместо этого представление напрямую связывается с моделью представления. Модель презентации - это модель, созданная специально для просмотра. Это означает, что эта Модель может раскрывать свойства, которые никогда не наденут на модель предметной области, поскольку это будет нарушением разделения интересов. В этом случае модель представления связывается с моделью предметной области и может подписываться на события, поступающие из этой модели. Затем представление подписывается на события, поступающие из модели презентации, и обновляется соответствующим образом. Модель представления может предоставлять команды, которые представление использует для вызова действий. Преимущество этого подхода состоит в том, что вы можете по существу полностью удалить код, поскольку PM полностью инкапсулирует все поведение представления.Модель-Вид-ВидМодель .
В MSDN есть статья о модели представления и раздел в Руководстве по составным приложениям для WPF (прежняя призма) об отдельных шаблонах представления.
источник
MVC
часто используется веб-фреймворками, напримерLaravel
, когда полученные URL-запросы (возможно, сделанные пользователями) обрабатываются,Controller
а HTML-код, сгенерированный посредством,View
отправляется клиенту. Таким образом,View
часть является частью серверной части, а пользователь никогда не сможет получить к нему доступ напрямую, и если вы столкнетесь с чем-то противоположным, то расцените это как расширение MVC (или даже нарушение). @Panzercrisis, это отличается отMVP
(как это используется вAndroid
ОС), гдеactions route through the View to the Presenter
и пользователь имеет прямой доступ кView
.Это упрощение многих вариантов этих шаблонов проектирования, но мне нравится думать о различиях между ними.
MVC
MVP
источник
Некоторое время назад я писал об этом, цитируя превосходный пост Тодда Снайдера о разнице между ними :
Это лучшее объяснение в Интернете, которое я мог найти.
источник
Вот иллюстрации, которые представляют коммуникационный поток
источник
MVP - это не обязательно сценарий, когда представление является ответственным (см., Например, MVP Taligent).
Я сожалею, что люди все еще проповедуют это как шаблон («Представление во главе») в противоположность анти-шаблону, поскольку он противоречит «Это просто представление» (Pragmatic Programmer). «Это просто представление» гласит, что окончательный вид, отображаемый для пользователя, является второстепенной задачей приложения. MVP модель от Microsoft делает повторное использование представлений гораздо более сложна и удобно отговорки дизайнер компании Microsoft от поощрения плохой практики.
Чтобы быть совершенно откровенным, я думаю, что основные проблемы MVC справедливы для любой реализации MVP, и различия почти полностью семантические. Пока вы следите за разделением интересов между представлением (которое отображает данные), контроллером (который инициализирует и контролирует взаимодействие с пользователем) и моделью (базовые данные и / или службы)), вы получаете преимущества MVC. , Если вы добиваетесь преимуществ, то кого действительно волнует, является ли ваш паттерн MVC, MVP или Supervising Controller? Единственный реальный образец остается как MVC, остальные просто отличаются его разновидностями.
Рассмотрим эту чрезвычайно захватывающую статью, в которой подробно перечислен ряд этих различных реализаций. Вы можете заметить, что все они в основном делают одно и то же, но немного по-другому.
Лично я считаю, что MVP был недавно вновь введен в качестве броского термина для сокращения споров между семантическими фанатиками, которые утверждают, является ли что-то действительно MVC или нет, или для оправдания инструментов быстрой разработки приложений Microsoft. Ни одна из этих причин в моих книгах не оправдывает его существование как отдельную модель проектирования.
источник
MVP: вид отвечает.
Представление, в большинстве случаев, создает своего предъявителя. Докладчик будет взаимодействовать с моделью и управлять представлением через интерфейс. Представление иногда взаимодействует с докладчиком, как правило, через некоторый интерфейс. Это сводится к реализации; Вы хотите, чтобы представление вызывало методы для докладчика, или вы хотите, чтобы представление имело события, которые слушатель прослушивает? Это сводится к следующему: представление знает о ведущем. Вид делегатов на докладчика.
MVC: контроллер отвечает.
Контроллер создается или доступен на основе какого-либо события / запроса. Затем контроллер создает соответствующий вид и взаимодействует с моделью для дальнейшей настройки вида. Это сводится к следующему: контроллер создает и управляет видом; вид подчинен контроллеру. Вид не знает о контроллере.
источник
MVC (модель просмотра контроллера)
Сначала вход направлен на контроллер, а не на вид. Эти данные могут поступать от пользователя, взаимодействующего со страницей, но это также может быть просто от ввода определенного URL-адреса в браузер. В любом случае, это Контроллер, который связан с некоторыми функциональными возможностями. Между контроллером и представлением существует отношение многие-к-одному. Это связано с тем, что один контроллер может выбирать различные представления для визуализации в зависимости от выполняемой операции. Обратите внимание на одностороннюю стрелку от контроллера к представлению. Это связано с тем, что представление не имеет каких-либо знаний или ссылок на контроллер. Контроллер действительно передает Модель обратно, поэтому существует знание между Представлением и ожидаемой Моделью, передаваемой в него, но не Контроллер, подающий его.
MVP (ведущий модельного представления)
Ввод начинается с просмотра, а не докладчика. Существует взаимно-однозначное сопоставление между представлением и связанным докладчиком. Представление содержит ссылку на докладчика. Ведущий также реагирует на события, запускаемые из представления, поэтому он знает о представлении, с которым он связан. Presenter обновляет представление на основе запрошенных действий, которые он выполняет над моделью, но представление не распознает модель.
Для получения дополнительной ссылки
источник
MVP
шаблоне, когда приложение загружается впервые, не отвечает ли докладчик за загрузку первого представления? Как, например, когда мы загружаем приложение facebook, разве докладчик не отвечает за загрузку страницы входа?Есть много ответов на этот вопрос, но я чувствовал, что нужен какой-то действительно простой ответ, четко сопоставляющий эти два вопроса. Вот обсуждение, которое я придумал, когда пользователь ищет название фильма в приложении MVP и MVC:
Пользователь: Нажмите, нажмите ...
Вид : Кто это? [ MVP | MVC ]
Пользователь: Я только что нажал на кнопку поиска ...
Вид : Хорошо, подожди секунду ... [ MVP | MVC ]
( Просмотр вызова ведущего | контроллера ...) [ MVP | MVC ]
Вид : Эй, Ведущий | Контроллер , Пользователь только что нажал на кнопку поиска, что мне делать? [ MVP | MVC ]
Ведущий | Контролер : Эй, вид , есть ли поисковый запрос на этой странице? [ MVP | MVC ]
Вид : Да, вот оно… «пианино» [ MVP | MVC ]
Докладчик : Спасибо, View ... пока я ищу поисковый запрос по модели , пожалуйста, покажите ему / ей индикатор выполнения [ MVP | MVC ]
( Ведущий | Контроллер вызывает модель …) [ MVP | MVC ]
Ведущий | Контроллер : Эй, модель , у тебя есть совпадение по этому поисковому запросу: «фортепиано» [ MVP | MVC ]
Модель : Эй, ведущий | Контроллер , дай мне проверить… [ MVP | MVC ]
( Модель делает запрос к базе данных фильма…) [ MVP | MVC ]
( Спустя некоторое время ... )
-------------- Здесь MVP и MVC начинают расходиться ---------------
Модель : Я нашел для вас список, ведущий , вот он в формате JSON «[{" name ":" Piano Teacher "," year ": 2001}, {" name ":" Piano "," year ": 1993} ] »[ MVP ]
Модель : есть некоторый результат, контроллер . Я создал переменную поля в моем экземпляре и заполнил ее результатом. Это имя "searchResultsList" [ MVC ]
( Ведущий | Контроллер благодарит Модель и возвращается к Представлению ) [ MVP | MVC ]
Ведущий : Спасибо за ожидание View , я нашел для вас список подходящих результатов и расположил их в презентабельном формате: ["Piano Teacher 2001", "Piano 1993"]. Пожалуйста, покажите это пользователю в вертикальном списке. Также, пожалуйста, скройте индикатор прогресса сейчас [ MVP ]
Контроллер : Спасибо за ожидание, View , я спросил модель о вашем поисковом запросе. Он говорит, что нашел список совпадающих результатов и сохранил их в переменной с именем "searchResultsList" внутри своего экземпляра. Вы можете получить это оттуда. Также, пожалуйста, скройте индикатор прогресса сейчас [ MVC ]
Просмотр : Большое спасибо Ведущий [ MVP ]
Вид : Спасибо «Controller» [ MVC ] (Теперь View спрашивает себя: Как я должен представить результаты , которые я получаю от модели ? Чтобы пользователь должен год производства фильма пришел первый или последний ... Должен ли это? быть в вертикальном или горизонтальном списке? ...)
В случае , если вы заинтересованы, я пишу серию статей , посвященных приложения архитектурных паттернов (MVC, MVP, MVVP, чистая архитектуру, ...) сопровождается Github репо здесь . Несмотря на то, что образец написан для Android, основные принципы могут быть применены к любому носителю.
источник
MVC = Модель-Вид-Контроллер
источник
Model-View-Controller
MVC - это образец архитектуры программного приложения. Он разделяет логику приложения на три отдельные части, способствуя модульности и простоте совместной работы и повторного использования. Это также делает приложения более гибкими и приветливыми к итерациям. Оно разделяет приложение на следующие компоненты:
Чтобы сделать это немного более понятным, давайте представим простое приложение со списком покупок. Все, что нам нужно, это список названий, количества и цены каждого товара, который нам нужно купить на этой неделе. Ниже мы опишем, как мы могли бы реализовать некоторые из этих функций, используя MVC.
Model-View-Presenter
Конкретный рабочий процесс запроса и отображения списка пользователей из базы данных может работать следующим образом:
MVC Pattern
Контроллер основан на поведении и может быть разделен между представлениями
Может быть ответственным за определение того, какой вид отображать (шаблон переднего контроллера)
MVP Pattern
Вид более слабо связан с моделью. Докладчик отвечает за привязку модели к представлению.
Легче для модульного тестирования, потому что взаимодействие с представлением осуществляется через интерфейс
Обычно вид на карту докладчика один к одному. Сложные представления могут иметь несколько докладчиков.
источник
Также стоит помнить, что существуют разные типы MVP. Фаулер разбил схему на две части - пассивное представление и контролирующий контроллер.
При использовании пассивного представления в вашем представлении обычно реализуется детальный интерфейс со свойствами, более или менее сопоставленными непосредственно с лежащим в основе виджетом пользовательского интерфейса. Например, у вас может быть ICustomerView со свойствами, такими как Имя и Адрес.
Ваша реализация может выглядеть примерно так:
Ваш класс Presenter будет говорить с моделью и «сопоставлять» ее с представлением. Этот подход называется «пассивным представлением». Преимущество заключается в том, что представление легко тестировать, и его легче перемещать между платформами пользовательского интерфейса (Web, Windows / XAML и т. Д.). Недостатком является то, что вы не можете использовать такие вещи, как привязка данных (что очень полезно в таких средах, как WPF и Silverlight ).
Второй вид MVP - Контролирующий Контроллер. В этом случае у вашего View может быть свойство Customer, которое опять-таки связано с виджетами пользовательского интерфейса. Вам не нужно думать о синхронизации и микро-управлении представлением, и Supervising Controller может вмешаться и помочь в случае необходимости, например, с помощью сложной логики взаимодействия.
Третий «аромат» MVP (или кто-то, возможно, назовет это отдельным шаблоном) - это модель представления (или иногда ее называют Model-View-ViewModel). По сравнению с MVP вы «объединяете» M и P в один класс. У вас есть объект customer, к которому привязаны ваши виджеты UI, но у вас также есть дополнительные поля, специфичные для UI, такие как "IsButtonEnabled", "IsReadOnly" и т. Д.
Я думаю, что лучший ресурс, который я нашел в архитектуре пользовательского интерфейса, - это серия постов в блоге, сделанных Джереми Миллером в серии «Построй свой собственный CAB». . Он рассмотрел все варианты MVP и показал код C # для их реализации.
Я также писал в блоге о модели Model-View-ViewModel в контексте Silverlight на сайте YouCard. Повторное посещение: Реализация шаблона ViewModel .
источник
Каждый из них решает разные проблемы и может даже объединяться, чтобы получить что-то вроде ниже
Здесь также есть полное сравнение MVC, MVP и MVVM.
источник
Обе эти структуры стремятся разделить проблемы - например, взаимодействие с источником данных (модель), логику приложения (или превращение этих данных в полезную информацию) (Controller / Presenter) и код отображения (View). В некоторых случаях модель также может использоваться для превращения источника данных в абстракцию более высокого уровня. Хорошим примером этого является проект MVC Storefront .
Существует дискуссия здесь о различиях между MVC против MVP.
Сделанное различие заключается в том, что в приложении MVC традиционно вид и контроллер взаимодействуют с моделью, но не друг с другом.
Проекты MVP предоставляют Presenter доступ к модели и взаимодействуют с представлением.
Сказав это, ASP.NET MVC по этим определениям является платформой MVP, потому что Контроллер обращается к Модели для заполнения Представления, которое, как предполагается, не имеет логики (просто отображает переменные, предоставленные Контроллером).
Чтобы, возможно, получить представление об отличии ASP.NET MVC от MVP, посмотрите эту презентацию MIX Скотта Хансельмана.
источник
Оба являются шаблонами, пытающимися отделить представление от бизнес-логики, отделяя бизнес-логику от аспектов пользовательского интерфейса.
Архитектурно, MVP - это подход, основанный на контроллере страниц, где MVC - это подход, основанный на фронт-контроллере. Это означает, что в стандартном MVP жизненный цикл страницы веб-формы просто улучшается за счет извлечения бизнес-логики из кода. Другими словами, страница - это тот, который обслуживает http-запрос. Другими словами, MVP IMHO - это веб-форма эволюционного типа улучшения. MVC, с другой стороны, полностью меняет игру, потому что запрос перехватывается классом контроллера перед загрузкой страницы, тут же выполняется бизнес-логика, а затем в конечном результате обработки контроллером данных, только что сброшенных на страницу («представление»). смысл MVC (по крайней мере для меня) во многом похож на разновидность MVP Supervising Controller, улучшенную с помощью механизма маршрутизации
Оба они включают TDD и имеют свои минусы и минусы.
Решение о том, как выбрать один из них, ИМХО, должно основываться на том, сколько времени вы потратили на разработку веб-формы ASP NET. Если кто-то считает себя хорошим в веб-формах, я бы предложил MVP. Если бы вы чувствовали себя не очень комфортно в таких вещах, как жизненный цикл страницы и т. Д., MVC мог бы быть здесь.
Вот еще одна ссылка в блоге, дающая чуть больше деталей по этой теме.
http://blog.vuscode.com/malovicn/archive/2007/12/18/model-view-presenter-mvp-vs-model-view-controller-mvc.aspx
источник
Я использовал как MVP, так и MVC, и хотя мы, как разработчики, склонны концентрироваться на технических различиях обоих шаблонов, точка зрения на MVP в IMHO гораздо больше связана с простотой принятия, чем с чем-либо еще.
Если я работаю в команде, которая уже хорошо разбирается в стиле разработки веб-форм, гораздо проще представить MVP, чем MVC. Я бы сказал, что MVP в этом сценарии - быстрая победа.
Мой опыт подсказывает мне, что перевести команду из веб-форм в MVP, а затем из MVP в MVC относительно легко; переход от веб-форм к MVC сложнее.
Я оставляю здесь ссылку на серию статей, опубликованных моим другом о MVP и MVC.
http://www.qsoft.be/post/Building-the-MVP-StoreFront-Gutthrie-style.aspx
источник
В MVP представление извлекает данные из презентатора, который рисует и подготавливает / нормализует данные из модели, в то время как в MVC контроллер извлекает данные из модели и устанавливает, нажимая в представлении.
В MVP вы можете иметь один вид, работающий с несколькими типами докладчиков, и один докладчик, работающий с несколькими различными представлениями.
MVP обычно использует какую-то структуру привязки, такую как среда привязки Microsoft WPF или различные рамки привязки для HTML5 и Java.
В этих рамках UI / HTML5 / XAML знает, какое свойство презентатора отображает каждый элемент пользовательского интерфейса, поэтому, когда вы связываете представление с презентатором, оно ищет свойства и знает, как извлечь из них данные и как установить их при изменении значения в пользовательском интерфейсе пользователем.
Так, если, например, модель является автомобилем, то презентатор - это своего рода презентатор автомобиля, который отображает свойства автомобиля (год, производитель, количество мест и т. Д.). Представление знает, что текстовое поле с именем 'car maker' должно отображать свойство Presenter Maker.
Затем вы можете привязать к представлению множество различных типов презентаторов, все они должны иметь свойство Maker - это может быть самолет, поезд или что-то еще, вид не имеет значения. Представление извлекает данные из докладчика - независимо от того, какой - пока он реализует согласованный интерфейс.
Этот связующий фреймворк, если его урезать, на самом деле это контроллер :-)
Итак, вы можете посмотреть на MVP как на эволюцию MVC.
MVC - это здорово, но проблема в том, что обычно его контроллер на просмотр. Контроллер A знает, как устанавливать поля представления A. Если теперь вы хотите, чтобы представление A отображало данные модели B, вам нужен контроллер A, чтобы узнать модель B, или вам нужен контроллер A, чтобы получить объект с интерфейсом - который похож на MVP только без привязок, или вам нужно переписать код набора пользовательского интерфейса в контроллере B.
Вывод - MVP и MVC оба являются развязкой шаблонов пользовательского интерфейса, но MVP обычно использует структуру привязок, которая находится под MVC. THUS MVP находится на более высоком архитектурном уровне, чем MVC, и шаблон оболочки выше MVC.
источник
Мой скромный короткий взгляд: MVP для больших масштабов и MVC для маленьких масштабов. С MVC я иногда чувствую, что V и C можно увидеть с двух сторон одного неделимого компонента, который напрямую связан с M, и одна неизбежно падает на это при переходе к более коротким масштабам, таким как элементы управления пользовательского интерфейса и базовые виджеты. На этом уровне детализации MVP имеет мало смысла. Когда человек, напротив, переходит в более масштабные масштабы, правильный интерфейс становится более важным, то же самое происходит с однозначным распределением обязанностей, и здесь появляется MVP.
С другой стороны, это практическое правило масштабирования может иметь очень малый вес, когда характеристики платформы благоприятствуют каким-то отношениям между компонентами, как, например, с сетью, где кажется, что реализовать MVC проще, чем MVP.
источник
Я думаю, что это изображение Эрвина Вандервалька (и сопровождающая статья ) является лучшим объяснением MVC, MVP и MVVM, их сходства и различий. Статья не отображается в результатах поиска по запросам на «MVC, MVP и MVVM» , потому что название статьи не содержит слова «MVC» и «MVP»; но это лучшее объяснение, я думаю.
(Эта статья также соответствует тому, что дядя Боб Мартин сказал в одном из своих выступлений: что MVC изначально был разработан для небольших компонентов пользовательского интерфейса, а не для архитектуры системы)
источник
Существует много версий MVC, этот ответ о оригинальном MVC в Smalltalk. Короче говоря, это
Этот доклад droidcon NYC 2017 - Чистый дизайн приложения с помощью компонентов архитектуры разъясняет это
источник
UIKit
Есть это хорошее видео от дяди Боба, где он кратко объясняет MVC и MVP в конце.
IMO, MVP - это улучшенная версия MVC, в которой вы в основном отделяете заботу о том, что вы собираетесь показывать (данные), от того, как вы собираетесь показывать (представление). Докладчик включает в себя своего рода бизнес-логику вашего пользовательского интерфейса, неявно навязывает, какие данные должны быть представлены, и предоставляет вам список глупых моделей представления. И когда приходит время показывать данные, вы просто подключаете свое представление (возможно, с теми же идентификаторами) к своему адаптеру и устанавливаете соответствующие поля представления, используя те модели представления с минимальным количеством вводимого кода (просто используя установщики). Его главное преимущество заключается в том, что вы можете проверить свою бизнес-логику пользовательского интерфейса на множестве различных представлений, таких как отображение элементов в горизонтальном или вертикальном списке.
В MVC мы говорим через интерфейсы (границы), чтобы склеить разные слои. Контроллер - это плагин для нашей архитектуры, но он не имеет такого ограничения, чтобы навязывать то, что показывать. В этом смысле MVP является своего рода MVC с концепцией представлений, подключаемых к контроллеру через адаптеры.
Надеюсь, это поможет лучше.
источник
Вы забыли про Action-Domain-Responder ( ADR ).
Как объяснено в некоторых графиках выше, существует прямая связь / связь между моделью и представлением в MVC. Действие выполняется на контроллере , который будет выполнять действие на модели . Это действие в модели , будет вызывать реакцию в View . View , постоянно обновляется , когда модель изменяется состояние «s.
Некоторые люди постоянно забывают, что MVC был создан в конце 70-х ». , и что Интернет был создан только в конце 80" / начале 90 ". MVC изначально создавался не для Интернета, а для настольных приложений, где контроллер Модель и Вид будут сосуществовать вместе.
Поскольку мы используем веб-фреймворки ( например, Laravel ), которые все еще используют те же соглашения об именах ( модель-представление-контроллер ), мы склонны думать, что это должен быть MVC, но на самом деле это нечто иное.
Вместо этого взгляните на Action-Domain-Responder . В ADR контроллер получает действие , которое будет выполнять операцию в модели / домене . Пока что тоже самое. Разница в том, что он затем собирает ответ / данные этой операции и передает их ответчику ( например:)
view()
для визуализации. Когда новое действие запрашивается в том же компоненте, контроллер вызывается снова, и цикл повторяется. В ADR нет никакой связи между моделью / доменом и представлением ( ответ Reponser ).Примечание: Википедия утверждает, что « Каждое действие ADR, однако, представлено отдельными классами или замыканиями ». Это не обязательно верно. Несколько действий могут быть в одном контроллере, и шаблон остается тем же.
MVC адр модель-представление-контроллер действия домена Ответчик
источник
Самый простой ответ - как представление взаимодействует с моделью. В MVP представление обновляется презентатором, который выступает в качестве посредника между представлением и моделью. Презентатор берет входные данные из представления, которое извлекает данные из модели, затем выполняет любую необходимую бизнес-логику и затем обновляет представление. В MVC модель обновляет представление напрямую, а не обратно через контроллер.
источник
источник
MVP
MVP расшифровывается как Model - View-Presenter. Это произошло в начале 2007 года, когда Microsoft представила Windows-приложения Smart Client.
Докладчик выступает в роли наблюдателя в MVP, который связывает события и бизнес-логику с моделями.
Привязка события представления будет реализована в Presenter из интерфейса представления.
Представление является инициатором пользовательских вводов, а затем делегирует события докладчику, а докладчик обрабатывает привязки событий и получает данные из моделей.
Плюсы: представлении есть только пользовательский интерфейс, а не логика. Высокий уровень тестируемости.
Минусы: немного сложнее и больше работы при реализации привязки событий
MVC
MVC расшифровывается как Model-View-Controller. Контроллер отвечает за создание моделей и рендеринг представлений с привязкой моделей.
Контроллер является инициатором, и он решает, какое представление визуализировать.
Плюсы: акцент на принципе единой ответственности Высокий уровень тестируемости
Минусы: иногда слишком большая рабочая нагрузка для контроллеров, если попытаться отобразить несколько представлений в одном контроллере.
источник