Какие архитектурные шаблоны используются в Android? [закрыто]


268

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

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

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

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

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


2
Учитывая, что платформа Android включает ядро ​​Linux, это слишком большой набор программного обеспечения, чтобы ответить на этот вопрос, кроме «всех названных шаблонов, и, возможно, нескольких новых, если вы посмотрите достаточно внимательно»
Пит Киркхэм,

5
@Pete, хорошо, возможно, вы правы, но в то же время я не захожу так глубоко, как ядро, меня интересует поверхность приложения, например, iOS, UIViewControllerреализованная с использованием MVC ( UIViewControllerэто контроллер, а его корень UIView- view) , UIApplicationиспользует делегирование , имеющий приложения делегат в качестве делегата и так далее ...
Burjua

4
Я думаю, что вы действительно должны изучать Android снизу вверх и не пытаться «перенести» свои знания с iOS на Android. Там есть много замечательных книг. Апресс делает кучу. Если вы понимаете жизненный цикл приложения и службы в Android, вы сможете понять, как правильно создавать приложения.
жалюзи


Это может помочь: stackoverflow.com/a/49694378
Али Нем

Ответы:


324

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

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

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

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

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

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

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

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

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

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

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

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


14
Отличный ответ! У меня есть вопросы, хотя: 1. Активность = Просмотр, я правильно понял? 2. Реализуете ли вы докладчик как собственный открытый класс или как внутренний класс упражнения? Или фрагмент (тоже внутренний класс)? 3. Вы имеете в виду, что классы переноса должны использоваться вместо реальных классов моделей в Activity (представление)?
мужчина

14
1. Да, я использую их как представления в шаблоне MVP. 2. лично я делю их на отдельные публичные классы, но я полагаю, что это дело вкуса :) 3. Я объяснил это довольно плохо, предложение «переслать необходимые классы» вводит в заблуждение. Я имею в виду, что докладчик сидит между представлением и моделью, читает модель и затем обновляет представление. Я
обновлю

спасибо, что
нашли

11
Я на самом деле очень люблю разработку Android, потому что она сильно отделена. Как я использую MVC: используйте Activity исключительно для ввода-вывода пользователя и используйте локальный сервис для всей вашей обработки. Когда сервис хочет что-то показать - транслируйте это на ваши мероприятия! Я действительно ненавижу, когда другие разработчики слишком много внимания уделяют работе.
Кто-то где-то

8
@SomeoneSomewhere, почему бы не иметь класс, который обрабатывает эти вещи в отдельном потоке / AsyncTasks, почему сервис?
Мальчик

87

Обновление ноябрь 2018

После нескольких лет работы и ведения блогов о MVC и MVP в Android (см. Текст ответа ниже) я решил собрать свои знания и понимание в более полной и легко усваиваемой форме.

Итак, я выпустил полноценный видеокурс об архитектуре приложений Android. Итак, если вы заинтересованы в освоении самых передовых архитектурных шаблонов в разработке для 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, я думаю, мы увидим еще несколько идей. На данный момент невозможно предсказать, какой шаблон (или шаблоны) станут отраслевыми стандартами в будущем - нам нужно подождать и посмотреть (я думаю, это вопрос года или двух).

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


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

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

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


2
Молодцы за предоставление таких ресурсов! Спасибо!
Александар

1
Очень полезные ссылки!
Semaphor

Мне нравится ваш видеокурс! Спасибо
Виктор Апоян

79

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

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

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


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


1
Спасибо за этот ответ Я был так запутан между архитектурными шаблонами и шаблонами проектирования, у меня есть еще один вопрос, что такое oo-дизайн и разработка !? @ Питер Уолтер
Руча Бхатт Джоши

Я голосую за этот ответ, потому что, хотя вопрос @Burjua упоминает шаблоны проектирования, ссылаясь на архитектуры, но они не совпадают. Я считаю этот ответ очень информативным и дополняющим исходный вопрос
Ксарен

Шина событий использует шаблон проектирования издателя и подписчика
Devrath

48

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

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

5
пожалуйста, поделитесь пожалуйста ссылками (ссылками)
shanraisshan

Пожалуйста, поделитесь ссылкой, чтобы я мог найти больше об этом. Спасибо
Сайед Хамза Хасан

27

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

Творческие образцы:

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

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

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

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

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

1
Ключевые моменты из статьи были бы хорошими.
Максим Г

Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
Бхаргав Рао

Шина событий использует шаблон проектирования издателя и подписчика
Devrath

16

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

1) View Holder использует Singleton Design Pattern

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

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

4) Broadcast Receiver использует шаблон проектирования Observer

5) Вид использует шаблон Composite Design

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


11

в случае уведомлений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);

3
Это на самом деле шаблон Builder.
Пиовезан

@Piovezan Я ошибаюсь. Спасибо, что поправили меня. Я думал, что это простая версия Pattern Decorator.
Джефф Т.

6

Android также использует шаблон проектирования ViewHolder.

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

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


5

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

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

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

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



1

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

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

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


0

Биндер использует «Шаблон наблюдателя» для уведомлений получателя смерти.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.