Шаблон MVC на Android - PullRequest
490 голосов
/ 28 мая 2010

Возможно ли реализовать шаблон модель-представление-контроллер в Java для Android?

Или это уже реализовано через Активности? Или есть лучший способ реализовать шаблон MVC для Android?

Ответы [ 21 ]

9 голосов
/ 13 ноября 2011

Шаблон MVC для Android (своего рода) реализован с помощью Адаптера классов. Они заменяют контроллер на «адаптер». Описание для адаптера гласит:

Объект Adapter действует как мост между AdapterView и базовые данные для этого представления.

Я просто смотрю на это для приложения Android, которое читает из базы данных, так что я пока не знаю, насколько хорошо оно работает. Однако это похоже на архитектуру Model-View-Delegate в Qt, которая, как они утверждают, является шагом по сравнению с традиционным шаблоном MVC. По крайней мере, на ПК шаблон Qt работает довольно хорошо.

9 голосов
/ 11 сентября 2012

Хотя этот пост кажется устаревшим, я хотел бы добавить следующие два, чтобы сообщить о последних разработках в этой области для Android:

android-binding - Предоставление структуры, которая позволяет связывать виджеты android view с моделью данных. Это помогает реализовать шаблоны MVC или MVVM в приложениях для Android.

roboguice - RoboGuice исключает догадки из разработки. Введите ваш View, Resource, System Service или любой другой объект и позвольте RoboGuice позаботиться о деталях.

9 голосов
/ 16 ноября 2014

Контроллер модельного представления (MVC)

enter image description here


Описание:

  • Когда нам приходится заниматься крупными проектами в разработке программного обеспечения, MVC обычно используется, потому что это универсальный способ организации проекты.
  • Новые разработчики могут быстро адаптироваться к проекту
  • Помогает в разработке больших проектов и кроссплатформенных тоже.

Шаблон MVC по сути такой:

  • Модель: что отображать. Это может быть источником данных (например, сервер, сырье данные в приложении)
  • Просмотр: как это отображается. Это может быть XML. Таким образом, действует как фильтр представления. Представление прикреплено к его модели (или части модели) и получает данные, необходимые для презентации.
  • Контроллер: обработка событий, таких как пользовательский ввод. Это будет деятельность

Важная особенность MVC: Мы можем модифицировать Либо Модель, либо Вид, либо Контроллер, по-прежнему не влияя на другие

  • Скажем, мы меняем цвет в представлении, размере представления или позиции зрения. Это не повлияет на модель или контроллер
  • Скажем, мы меняем модель (вместо данных, полученных с сервера) извлекать данные из активов), но это не повлияет на Контроллер
  • Скажем, мы меняем контроллер (логику в действии), на который он не повлияет модель и вид
7 голосов
/ 12 апреля 2012

Я думаю, что самое полезное упрощенное объяснение здесь: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

Из всего, что я видел и читал здесь, реализация всего этого усложняет и не вписывается в другие части Android.

Осуществление действия, реализующего других слушателей, уже является стандартным способом Android. Самый безобидный способ - добавить Java Observer, как описывают слайды, и сгруппировать действия onClick и другие типы в функции, которые все еще находятся в Activity.

Путь Android состоит в том, что Activity выполняет оба действия. Борьба с ним на самом деле не облегчает расширение или создание будущего кодирования.

Я согласен с 2-й пост . Это уже реализовано, но не так, как привыкли люди. Независимо от того, находится он в одном файле или нет, разделение уже есть. Нет необходимости создавать дополнительное разделение для соответствия другим языкам и операционным системам.

5 голосов
/ 18 марта 2018

Было удивительно видеть, что ни один из постов здесь не ответил на вопрос. Они либо слишком общие, расплывчатые, неправильные или не относятся к реализации в Android.

В MVC слой View знает только, как отобразить пользовательский интерфейс (UI). Если для этого нужны какие-либо данные, они получают их из слоя Model . Но View НЕ напрямую просит модель найти данные, он делает это через Controller . Таким образом, Controller вызывает Model для предоставления необходимых данных для View . Когда данные готовы, контроллер 1016 * информирует View , что данные готовы для получения с Model . Теперь View может получать данные от Model .

.

Этот поток можно обобщить следующим образом:

enter image description here

Стоит отметить, что View может знать о доступности данных в Model через Контроллер - также известный как Пассивный MVC - или путем наблюдения данных в Model путем регистрации наблюдаемых для него значений, которые Active MVC .

Что касается реализации, первое, что приходит на ум, это то, какой компонент Android следует использовать для View ? Activity или Fragment?

Ответ в том, что это не имеет значения, и оба могут быть использованы. View должен иметь возможность представлять пользовательский интерфейс (UI) на устройстве и реагировать на взаимодействие пользователя с UI. И Activity, и Fragment предоставляют необходимые методы для этого.

В примере приложения, используемого в этой статье Я использовал Activity для слоя View , но также можно использовать Fragment.

Полный пример приложения можно найти в ветке 'mvc' моего репозитория GitHub здесь .

Я также имел дело с плюсами и минусами архитектуры MVC в Android на примере здесь .

Для тех, кто заинтересован, я начал серию статей по архитектуре приложений для Android здесь , в которых я сравниваю различные архитектуры, например, MVC, MVP, MVVM, для разработки приложений для Android через готовое приложение.

5 голосов
/ 29 апреля 2015

Устав от катастрофы MVx на Android, я недавно создал крошечную библиотеку, которая обеспечивает однонаправленный поток данных и похожа на концепцию MVC: https://github.com/zserge/anvil

По сути, у вас есть компонент (активность, фрагмент и группа просмотра). Внутри вы определяете структуру и стиль слоя представления. Также вы определяете, как данные должны быть связаны с представлениями. Наконец, вы можете связать слушателей в одном и том же месте.

Затем, когда ваши данные будут изменены, будет вызван глобальный метод render (), и ваши представления будут обновлены с использованием самых последних данных.

Вот пример компонента, в котором есть все для компактности кода (конечно, модель и контроллер могут быть легко разделены). Здесь «count» - это модель, метод view () - это представление, а «v -> count ++» - это контроллер, который прослушивает нажатия кнопок и обновляет модель.

public MyView extends RenderableView {
  public MyView(Context c) {
      super(c);
  }

  private int count = 0;

  public void view() {
    frameLayout(() -> {              // Define your view hierarchy
      size(FILL, WRAP);
      button(() -> {
          textColor(Color.RED);      // Define view style
          text("Clicked " + count);  // Bind data
          onClick(v -> count++);     // Bind listeners
      });
    });
  }

С разделенной моделью и контроллером это будет выглядеть так:

button(() -> {
   textColor(Color.RED);
   text("Clicked " + mModel.getClickCount());
   onClick(mController::onButtonClicked);
});

Здесь при каждом нажатии кнопки число будет увеличиваться, затем вызывается функция render () и текст кнопки будет обновляться.

Синтаксис становится более приятным, если вы используете Kotlin: http://zserge.com/blog/anvil-kotlin.html. Также существует альтернативный синтаксис для Java без лямбд.

Сама библиотека очень легкая, не имеет зависимостей, не использует отражения и т. Д.

(Отказ от ответственности: я автор этой библиотеки)

4 голосов
/ 28 октября 2015

Не существует реализованной архитектуры MVC, но существует набор библиотек / примеров для реализации архитектуры MVP (модель-представление-презентатор).

Пожалуйста, проверьте эти ссылки:

Google добавил пример архитектуры Android MVP:

3 голосов
/ 23 сентября 2013

Я видел, что многие говорят, что MVC уже реализован в Android, но это не так. По умолчанию Android не следует MVC.

Поскольку я не думаю, что Google когда-либо насильно навязывает ограничения реализации MVC, такой как iPhone, но это зависит от разработчиков, какой шаблон или метод они хотят использовать в своем проекте, В небольших или простых приложениях использование MVC не требуется, но По мере того, как приложение растет и усложняется и требует модификации своего кода в последующие годы, возникает потребность в паттерне MVC в Android.

Обеспечивает простой способ изменения кода, а также помогает в уменьшении проблем. Если вы хотите реализовать MVC на Android, перейдите по приведенной ниже ссылке и наслаждайтесь реализацией MVC в своем проекте.

http://www.therealjoshua.com/2011/11/android-architecture-part-1-intro/

Но в настоящее время я думаю, что MVP вместе с Android Architectural Pattern является одним из лучших вариантов, который разработчики должны использовать для чистых и надежных приложений для Android.

3 голосов
/ 23 октября 2014

Согласно объяснению , которое объяснила команда Xamarin (на iOS MVC «Я знаю, это кажется странным, но подождите секунду»):

  • Модель (логика данных или приложения),
  • Вид (пользовательский интерфейс) и
  • Контроллер (код сзади).

Я могу сказать это:

Модель на Android - это просто подлежащий продаже объект. Представление - это макет XML, а контроллер - это (действие + его фрагмент).

* Это только мое мнение, а не из какого-либо ресурса или книги.

2 голосов
/ 02 июня 2014

Когда мы применяем MVC, MVVM или Presentation Model к приложению для Android, мы действительно хотим иметь четко структурированный проект и, что еще важнее, проще для модульных тестов.

В настоящее время без стороннего фреймворка у вас обычно много кода (например, addXXListener (), findViewById () и т. Д.), Который не добавляет никакой ценности для бизнеса.

Более того, вы должны запускать юнит-тесты Android вместо обычных JUnit-тестов, которые запускаются годами и делают юнит-тесты несколько непрактичными. По этим причинам несколько лет назад мы запустили проект с открытым исходным кодом, RoboBinding - Фреймворк для представления данных с привязкой к данным для платформы Android.

RoboBinding помогает вам писать код пользовательского интерфейса, который легче читать, тестировать и обслуживать. RoboBinding устраняет необходимость в ненужном коде, таком как addXXListener или около того , и переносит логику пользовательского интерфейса в Presentation Model, которая является POJO и может быть протестирована с помощью обычных тестов JUnit . Сам RoboBinding поставляется с более чем 300 тестами JUnit для обеспечения его качества.

...