Другие ответы могут быть непростыми для понимания тем, кто не очень хорошо знаком с предметом архитектурных моделей. Кто-то, кто является новичком в архитектуре приложения, возможно, захочет узнать, как его выбор может повлиять на ее приложение на практике и какова суета в сообществах.
Пытаясь пролить свет на вышесказанное, я составил этот сценарий с участием MVVM, MVP и MVC. История начинается с того, что пользователь нажимает кнопку «НАЙТИ» в приложении для поиска фильмов…:
Пользователь: Нажмите…
Просмотр : Кто это? [ MVVM | MVP | MVC ]
Пользователь: Я только что нажал на кнопку поиска ...
Просмотр : Хорошо, подождите секунду…. [ MVVM | MVP | MVC ]
( Просмотр вызова ViewModel | Presenter | Контроллер …) [ MVVM | MVP | MVC ]
Просмотр : Привет ViewModel | Presenter | Контроллер , пользователь только что нажал на кнопку поиска, что мне делать ? [ MVVM | MVP | MVC ]
ViewModel | Presenter | Контроллер : Привет View , есть ли поисковый запрос на этой странице? [ MVVM | MVP | MVC ]
Вид : Да,… вот оно… «пианино» [ MVVM | MVP | MVC ]
—— Это самое важное различие между MVVM И MVP | MVC ———
Ведущий : Спасибо Просмотр , ... пока что я ищу поисковый запрос по Модель , покажите ему / ей индикатор выполнения [ MVP | MVC ]
( Presenter | Контроллер вызывает Модель …) [ MVP | MVC ]
ViewController : Спасибо, я буду искать поисковый запрос на Модель , но не буду обновлять вас напрямую. Вместо этого я буду инициировать события для searchResultsListObservable, если есть какой-либо результат. Так что тебе лучше наблюдать за этим. [* 1 099 * MVVM ]
(Наблюдая за любым триггером в searchResultsListObservable, View считает, что должен показывать пользователю какой-то индикатор выполнения, поскольку ViewModel не будет с ним разговаривать)
------------------------------
ViewModel | Presenter | Контроллер : Привет Модель , У вас есть совпадения по этому поисковому запросу: «фортепиано» [ MVVM | MVP | MVC ]
Модель : Привет ViewModel | Ведущий | Контроллер , позвольте мне проверить… [ MVVM | MVP | MVC ]
( Модель делает запрос к базе данных фильмов…) [ MVVM | MVP | MVC ]
(Через некоторое время ...)
———— Это точка расхождения между MVVM , MVP и MVC ————
Модель : Я нашел для вас список, ViewModel | Presenter , вот он в JSON «[{« name »:« Piano Teacher » , «Year»: 2001}, {«name»: «Piano», «year»: 1993}] »[ MVVM | MVP ]
Модель : Доступен какой-то результат, контроллер. Я создал переменную поля в моем экземпляре и заполнил ее результатом. Это имя «searchResultsList» [ MVC ]
( Presenter | Контроллер спасибо Модель и возвращается к View ) [ MVP | MVC ]
Ведущий : Спасибо за ожидание Просмотр , я нашел для вас список подходящих результатов и упорядочил их в презентабельном формате: [«Piano Teacher 2001», «Piano 1993» ]. Также, пожалуйста, скройте индикатор выполнения [ MVP ]
Контроллер : Спасибо за ожидание Просмотр , я спросил модель о вашем поисковом запросе. Он говорит, что нашел список подходящих результатов и сохранилem в переменной с именем «searchResultsList» внутри своего экземпляра. Вы можете получить это оттуда. Также, пожалуйста, скрыть индикатор выполнения сейчас [ MVC ]
ViewModel : Любой наблюдатель в searchResultsListObservable может быть уведомлен о наличии нового списка в презентабельном формате: [«Piano Teacher 2001», «Piano 1993»]. 1215 *
Просмотр : Большое спасибо Ведущий [ MVP ]
Просмотр : Спасибо « Контроллер » [ MVC ] (Теперь Просмотр задается вопросом: как мне представить результаты, которые я получаю от Model для пользователя? Должен ли год производства фильма быть первым или последним…?)
Представление : О, есть новый триггер в searchResultsListObservable…, хорошо, есть презентабельный список, теперь мне нужно только показать его в списке. Я должен также скрыть индикатор выполнения теперь, когда у меня есть результат. [ MVVM ]
Если вам интересно, я написал серию статей здесь , сравнивающих MVVM, MVP и MVC с помощью приложения для поиска фильмов для Android.