Какие шаблоны дизайна используются на Android?

Я занимаюсь небольшим исследованием мобильных платформ, и мне хотелось бы узнать, какие шаблоны дизайна используются в Android?

Например, в iOS Model-view-controller очень широко используется вместе с делегированием и другими шаблонами.

Какие шаблоны и где, в частности, используется Android?

РЕДАКТИРОВАТЬ

Я не прошу шаблоны проектирования, используемые в глубине ядра, dalvik и т. Д., Но о шаблонах, которые разработчик приложений встретит при разработке приложения.

Я попытался использовать шаблоны проектирования модели-представления-контроллера (MVC) и модели-представления-презентатора для разработки Android. Мои результаты – контроллер модели-зрения работает отлично, но есть пара «проблем». Все сводится к тому, как вы воспринимаете класс Android Activity . Это контроллер, или это вид?

Фактический класс Activity не расширяет класс представления Android, но он, однако, обрабатывает отображение окна пользователю, а также обрабатывает события этого окна (onCreate, onPause и т. Д.).

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

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

Из-за этого я лично считаю, что модель-представление-презентатор- образец идеально подходит для разработки Android. Поскольку роль представления в этом шаблоне:

  • Обслуживание в качестве точки входа
  • Рендеринг компонентов
  • Маршрутизация событий пользователя ведущему

Это позволяет реализовать вашу модель следующим образом:

View – это содержит компоненты пользовательского интерфейса и обрабатывает события для них.

Presenter – это будет поддерживать связь между вашей моделью и вашим представлением, посмотрите на нее как на шлюз вашей модели. Смысл, если у вас есть сложная модель домена, представляющая, Бог знает, что, и вашему представлению требуется только очень небольшое подмножество этой модели, задание докладчиков состоит в том, чтобы запросить модель, а затем обновить представление. Например, если у вас есть модель, содержащая абзац текста, заголовок и число слов. Но в данном представлении вам нужно отобразить заголовок в представлении. Затем ведущий будет считывать данные, необходимые для модели, и соответственно обновлять представление.

Модель – это в основном ваша модель полного домена. Надеюсь, это поможет сделать вашу модель домена более «жесткой», так как вам не понадобятся специальные методы для рассмотрения случаев, о которых говорилось выше.

Развязывая модель из представления все вместе (с помощью презентера), она также становится гораздо более интуитивной, чтобы протестировать вашу модель. У вас могут быть модульные тесты для вашей модели домена и модульные тесты для ваших докладчиков.

Попробуйте. Я лично считаю, что это отлично подходит для разработки Android.

Этот ответ был обновлен, чтобы оставаться актуальным с ноября 2016 года


Похоже, вы ищете архитектурные шаблоны, а не шаблоны дизайна .

Шаблоны проектирования нацелены на описание общего «трюка», который программист может реализовать для обработки определенного набора повторяющихся задач программного обеспечения. Например: В ООП, когда необходимо, чтобы объект уведомлял о множестве других объектов о некоторых событиях, можно использовать шаблон проектирования наблюдателя .

Поскольку приложения Android (и большая часть AOSP) написаны на Java, объектно-ориентированное, я думаю, вам будет трудно найти один шаблон проектирования ООП, который НЕ используется на Android.

Архитектурные шаблоны , с другой стороны, не рассматривают конкретные задачи программного обеспечения – они нацелены на предоставление шаблонов для организации программного обеспечения на основе вариантов использования рассматриваемого программного компонента.

Это звучит немного сложно, но я надеюсь, что пример пояснит: если какое-то приложение будет использоваться для извлечения данных с удаленного сервера и представить его пользователю структурированным образом, тогда MVC может быть хорошим кандидатом для рассмотрения. Обратите внимание, что я ничего не сказал о задачах программного обеспечения и потоке программ приложения – я только что описал его с точки зрения пользователя, и появился кандидат на архитектурный шаблон.

Поскольку вы упомянули MVC в своем вопросе, я бы предположил, что архитектурные шаблоны – это то, что вы ищете.

Введите описание изображения здесь


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

Но сегодня ситуация другая: недавно Google выпустила библиотеку Data Binding , которая полностью интегрирована с Android Studio, и даже выпустила набор архитектурных чертежей для приложений Android .

Два года назад было очень сложно найти информацию о MVC или MVP на Android. Сегодня MVC, MVP и MVVM стали «гудкими словами» в сообществе Android, и нас окружают бесчисленные эксперты, которые постоянно пытаются убедить нас, что MVx лучше MVy. На мой взгляд, обсуждение того, является ли MVx лучше MVy, совершенно бессмысленно, потому что сами термины очень неоднозначны – просто посмотрите на ответы на этот вопрос , и вы поймете, что разные люди могут связывать эти аббревиатуры с совершенно разными конструкциями.

В связи с тем, что поиск наилучшего архитектурного шаблона для Android официально начался, я думаю, что мы собираемся увидеть еще несколько идей. На данный момент невозможно предсказать, какой шаблон (или шаблоны) станет в будущем отраслевым стандартом – нам нужно будет подождать и посмотреть (я думаю, это вопрос года или два).

Однако есть одно предсказание, которое я могу сделать с высокой степенью уверенности: использование библиотеки привязки данных не станет отраслевым стандартом. Я уверен, что это потому, что библиотека привязки данных (в ее текущей реализации) обеспечивает кратковременную прирост производительности и своеобразный архитектурный ориентир, но в конечном итоге это сделает код не поддерживаемым. Как только долгосрочные эффекты этой библиотеки окажутся на поверхности – она ​​будет оставлена.


Теперь, хотя сегодня у нас есть какие-то официальные рекомендации и инструменты, я лично не считаю, что эти рекомендации и инструменты являются лучшими доступными вариантами (и они определенно не единственные). В моих приложениях я использую собственную реализацию архитектуры MVC. Он прост, чист, читабельен и проверен и не требует дополнительных библиотек.

Этот MVC не просто косметически отличается от других – он основан на теории, согласно которой действия в Android не являются элементами UI , что имеет огромное влияние на организацию кода.

Итак, если вы ищете хороший архитектурный образец для приложений для Android, который следует принципам SOLID , вы можете найти описание одного из них в моем сообщении о шаблонах архитектуры MVC и MVP в Android .

Существуют различные шаблоны, используемые в инфраструктуре Android, такие как:

  • Широковещательный приемник использует шаблон Observer
  • Вызов службы Remoter использует шаблон прокси
  • Просмотр и просмотр групп использует композитный шаблон
  • Медиа-каркас использует шаблон фасада

Вот отличная статья об общих шаблонах дизайна для Android :

Создание шаблонов:

  • Builder (например, AlertDialog.Builder )
  • Инъекция зависимостей (например, Кинжал 2 )
  • одиночка

Структурные структуры:

  • Адаптер (например, RecyclerView.Adapter )
  • Фасад (например, дооснащение )

Поведенческие модели:

  • Команда (например, EventBus )
  • Наблюдатель (например, RxAndroid )
  • Контроллер просмотра модели
  • Model View ViewModel ( аналогично шаблону MVC выше )

В следующих классах Android используются шаблоны проектирования

1) View Holder использует шаблон дизайна Singleton

2) Намерение использует шаблон фабричного проектирования

3) Адаптер использует шаблон дизайна адаптера

4) Широковещательный приемник использует шаблон проектирования наблюдателя

5) Просмотр использует композитный шаблон дизайна

6) Media FrameWork использует шаблон оформления фасада

Введите описание изображения здесь

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

Надеюсь, вы найдете это полезным.

В случае NotificationCompat.Builder использует шаблон Builder

как,

 mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_stat_notification) .setContentTitle(getString(R.string.notification)) .setContentText(getString(R.string.ping)) .setDefaults(Notification.DEFAULT_ALL); 

Android также использует шаблон дизайна ViewHolder.

Он используется для повышения производительности ListView при прокрутке.

Шаблон проектирования ViewHolder позволяет получить доступ к каждому элементу списка элементов без необходимости поиска, экономя ценные циклы процессора. В частности, это позволяет избежать частых вызовов findViewById () во время прокрутки ListView, и это сделает его гладким.

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

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

На данный момент, без сторонней структуры, у вас обычно есть много кода (например, addXXListener (), findViewById () и т. Д.), Что не добавляет каких-либо бизнес-значений. Более того, вам нужно запускать тесты для Android, а не обычные тесты JUnit, которые требуют времени для запуска и делают блок-тесты несколько непрактичными.

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

Я хотел бы добавить шаблон дизайна, который был применен в Android Framework. Это Half Sync Half Async, используемый в реализации Asynctask. Смотрите мое обсуждение на

https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing

В Android шаблон «Work queue processor» обычно используется для разгрузки задач из основного потока приложения.

Пример: дизайн класса IntentService.

IntentService получает Intents, запускает рабочий поток и останавливает службу по мере необходимости. Все запросы обрабатываются на одном рабочем потоке.

Binder использует «Observer Pattern» для уведомлений о получателях смерти.